- ベストアンサー
C言語でプログラムを書きたいんですが…
1から6までの好きな数字を入力するたびに、“大当たり”が1/6の確率、“当たり”が1/3の確率、“はずれ”が1/2の確率で、福引きができる。 というプログラムをC言語で書きたいんですが、どんな感じに書いたらいいか思い浮かびません。 どなたか詳しい方教えてください。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
宿題と言い当てた者です。(^o^;) randやsrandはC言語の中でも簡単な方だと思います。 教わっていないから使わないではなくて、 教わっていなくても自分で調べて使っちゃいましょうよ。 通信簿がよくなるかもですよ! (私は、昔、某専門学校で、「C言語によるネットワークプログラミング」の講師のアルバイトをしていましたが、教えていない技を自分で調べて、やってくる学生にはよい成績をつけましたよ。) 問題の条件として、「randの使用は禁止する」というのであれば話は変わりますが。。。 この際、マスターしちゃいましょうよ。
その他の回答 (8)
- minmin1234
- ベストアンサー率35% (13/37)
それでもどうしてもrandは使わないでやりたいのであれば、 簡単な関数でも乱数もどきを生成できます。 http://www.ysr.net.it-chiba.ac.jp/data/rand/node5.html http://www.sm.rim.or.jp/~shishido/pie.html C言語的に書くと、 x[i+1] = (x[i] * a + b ) % c でループを回せばいいと思います。 a,bは適当な定数、cは生成させたい乱数の最大値だと思います。 # randを使うよりも難しくなっちゃていると思います。。。 言葉でいうと 「初期値にある定数をかけて別の定数を加え、それをある数で割った余りの数値を次の乱数とする」 ですね。わかりやすいですよね。 難しい言葉でいうと「線形合同法」っていうみたいです。
- Bonjin
- ベストアンサー率43% (418/971)
>乱数randは習ってないので、他のやり方ないでしょうか? randを使わずにやってこなければならない宿題なのでしょうか? 宿題の意図的にはrandの使い方を覚えてこいという意図にしか受け取れないのですが?
お礼
そーですよね!この際覚えようと思います!
- HokUebun
- ベストアンサー率0% (0/1)
後は、こんな感じとかでしょうか。 #include<stdio.h> #include<time.h> #include<stdlib.h> int HitNum[6]; void HitNumSet() { for(int i=0,int m=0;i<6;i++,m++) { srand(time(NULL)+i+m*m); HitNum[i]=rand()%6+1; for(int j=0;j<i;j++) { if(HitNum[i]==HitNum[j]) { i--; } } } return; } int main() { HitNumSet(); int Key=0; scanf("%d",&Key); if(Key==HitNum[0]){printf("Big Hit");} else if(Key==HitNum[1] || Key==HitNum[2]){printf("Normal Hit");} else if(Key==HitNum[3] || Key==HitNum[4] || Key==HitNum[5]){printf("Bad Hit");} else{printf("数値が正しくありません。");} getchar();getchar(); return 0; }
- HokUebun
- ベストアンサー率0% (0/1)
こんな感じとかでどうでしょう? #include<stdio.h> #include<time.h> int main() { int Key=0; scanf("%d",&Key); switch(Key) { case 1: printf("Big Hit"); break; case 2: case 5: case 6: printf("Bad Hit"); break; default: printf("Normal Hit"); } getchar();getchar(); return 0; }
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
乱数を使って、 1~6の数字の内1つを大当たりの数に決め2つを当たりにしておいて、入力された数字を決めた数になっているか調べて結果を表示します。
- kochory
- ベストアンサー率45% (167/370)
数字を入力する意味がまったく無いように思うのですが・・・
お礼
学校の宿題だというのを、書いていませんでした。すいません。 宿題なもんで、私の質問にあるようなプログラムを書かなければならないんです。
- kiwicky
- ベストアンサー率16% (1/6)
012345の乱数を発生させるだけです。
お礼
回答ありがとうございます。 乱数randは習ってないので、他のやり方ないでしょうか?
- minmin1234
- ベストアンサー率35% (13/37)
お察しするに、学校のC言語プログラミング演習といった講座での宿題ですね! 原始的な方法を一つ。。。 ・下記のような二次元配列を用意します。 (×:はずれ、○:あたり、◎:大当り) 1 2 3 4 5 6 1 × × × ○ ○ ◎ 2 × × × ○ ◎ ○ 3 × × × ◎ ○ ○ 4 × × ○ × ○ ◎ 5 × × ○ × ◎ ○ 6 × × ◎ × ○ ○ 7 × × ○ ○ × ◎ ・ ・ ・ (以下、全パタンを用意する。全部でN個の行ができたとする。) ・1から6の入力(scanf)のたびに、乱数(rand)を発生させ、それをNで割った余り(%)を行のインデックスとし、入力値を列のインデックスとして、上記配列からその値を求める。それが、×、○、◎のどれになるかで結果を求める。 どうでしょうか。。。。グッドラック!
お礼
お礼が遅くなって申し訳ないです。 >>学校のC言語プログラミング演習といった講座での宿題ですね! まさにそのとうりなんです! 2次元配列の考え方すごく参考になりました。
補足
ですが、乱数randは習ってないんです…。 ですので、使わずに書きたいんですが、どーしたらいいでしょうか? 質問ばっかりですいません。プログラミング苦手なんです^^;
お礼
何度も丁寧に教えていただいてホントありがとうございます! 乱数自分で調べて覚えようと思います。