前提・実現したいこと

ソシャゲのガチャのシミュレーターを作りたいが乱数の生成がうまくいかない。
うまく乱数を生成するためにはどうしたらいいのでしょうか。

発生している問題・エラーメッセージ

確率1.5%で当たる抽選を

rand()%200+1;

で乱数を生成させ、乱数が198~200の範囲ならばあたるようにすることで作ったが、1000万回ほど回してもあたりを引かない。

該当のソースコード

#include <stdio.h>#include <stdlib.h>#include <time.h>#define PN 10000000int c[PN+1],i;void main(){srand(time(NULL));for(i=1;i<=PN;i++){c[i]=rand()%200+1;}for(i=1;i<=PN;i++){if(197<c[i]<=200){printf("atari \n");}}}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

質問への追記・修正、ベストアンサー選択の依頼

  • 「rand()%200+1;で乱数を生成させ」...記載のコードは0が2つほど多くなってますが?

    キャンセル

  • c[CN+1] … CNなんて定義はありませんが?

    キャンセル

  • 2016/12/26 12:52 編集

    あと色々試行錯誤したのはわかりますが、「1000万回ほど回してもあたりを引かない。 」コード、つまり動くコードを貼ってもらえますか?質問の内容とコードをあわせてください。

    キャンセル

+2

こんにちは。

書いている間に解決しちゃいましたが、ツッコミどころ満載ですね。
ちょっと厳しいと思いますが、突っ込んでみました。ごめんなさい。

  1. インデントはきちんと付けましょう。
  2. int c[CN+1];のCNは未定義です。PNの間違いでしょう。
  3. main()はint型を返却する必要があります。
  4. iが未定義です。
  5. 設計はrand()%200+1なのにコードはrand()%20000+1となってます。
  6. if(197<c[i]<=200)は常に成立してしまいます。「あたりを引かない」と言う報告と矛盾してます。
  7. if(197<c[i]<=200)if((197<c[i]) && (c[i]<=200))と書くのが正解と思います。
  8. 0スタートに慣れましょう。本質的でない+1を減らせます。

修正してみました。

#include <stdio.h>#include <stdlib.h>#include <time.h>#define PN 10000000int c[PN];int main(){ srand(time(NULL)); for(int i=0;i<PN;i++) { c[i]=rand()%200; } for(int i=0;i<PN;i++) { if((197<=c[i]) && (c[i]<200)) { printf("atari\n"); } } return 0;}

でも、'''で囲む初心者さんが少ない中、きちんと'''で囲んでくれているのはたいへんありがたいです。
頑張って下さい。

投稿 2016/12/26 13:16

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

checkベストアンサー

0

実際に動かしてませんが、たぶんif文の書き方じゃないでしょうか。

if(197<c[i]<=200){↓if(197 < c[i] && c[i] <= 200){

投稿 2016/12/26 13:00

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

15分調べてもわからないことは、teratailで質問しよう!

関連した質問

  • 解決済

    前提・実現したいこと ここに質問したいことを詳細に書いてください 新・明解C言語 中級編の自由課題 演習1-1を解いているのですが、srandでわからないことがあります。演

  • 解決済

    C言語でLinuxを使っています。メモリを確保したりするプログラムなのですが、以下のプログラムを修正して 、5秒間で何回の入れ替えを行えるかを計測できるようにしてもらいたいです。初

  • 受付中

    前提・実現したいこと ここに質問したいことを詳細に書いてください cでマインスイーパー作成を作成しています。 発生している問題・エラーメッセージ 最初からばんめんにいく

  • 解決済

    前提・実現したいこと Cでタイピングゲームのような物を作っているのですが、今のコードのままだとランダムに表示させた問題を正解したときに再度同じ問題が出てしまいます 既に使用した

同じタグがついた質問を見る

  • C

    2144questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

閲覧数の多いCの質問