前提・実現したいこと
ソシャゲのガチャのシミュレーターを作りたいが乱数の生成がうまくいかない。
うまく乱数を生成するためにはどうしたらいいのでしょうか。
発生している問題・エラーメッセージ
確率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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
評価を下げる理由を選択してください
上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。
+2
こんにちは。
書いている間に解決しちゃいましたが、ツッコミどころ満載ですね。
ちょっと厳しいと思いますが、突っ込んでみました。ごめんなさい。
- インデントはきちんと付けましょう。
int c[CN+1];のCNは未定義です。PNの間違いでしょう。- main()はint型を返却する必要があります。
- iが未定義です。
- 設計は
rand()%200+1なのにコードはrand()%20000+1となってます。 if(197<c[i]<=200)は常に成立してしまいます。「あたりを引かない」と言う報告と矛盾してます。if(197<c[i]<=200)はif((197<c[i]) && (c[i]<=200))と書くのが正解と思います。- 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
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
以下のような回答は評価を下げられます
- 間違っている回答
- 質問の回答になっていない投稿
- 不快な投稿
評価を下げる際はその理由をコメントに書き込んでください。
質問への追記・修正、ベストアンサー選択の依頼
「rand()%200+1;で乱数を生成させ」...記載のコードは0が2つほど多くなってますが?
キャンセル
c[CN+1] … CNなんて定義はありませんが?
キャンセル
2016/12/26 12:52 編集
あと色々試行錯誤したのはわかりますが、「1000万回ほど回してもあたりを引かない。 」コード、つまり動くコードを貼ってもらえますか?質問の内容とコードをあわせてください。
キャンセル