• ベストアンサー

C言語のサイコロシミュレート

サイコロを1000回振って1~6の出る目の確率を表示したいのですが、ここからの続き分かりません。 教えてください。 #include<stdio.h> #include<stdlib.h> int main() { int sai, i; for(i = 1; i=< 1000; i++) { sai = rand() % 6 + 1; printf("出た目は = %d\n",sai); } return 0; } ここから今度は「1~6の数字がでた確率は0.…です。」と表示するプログラムを追加するにはどうすればいいのですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • naoya0302
  • ベストアンサー率39% (13/33)
回答No.3

私なりにとりあえず書いてみます。 #include<stdio.h> #include<stdlib.h> int main() { int sai, i; int kaisu[7]; //追加 1~6まで出た回数 double kakuritu[7]; for(i=0;i<7;i++) kaisu[i] = 0; //配列の初期化 for(i = 1; i=< 1000; i++) { sai = rand() % 6 + 1; printf("出た目は = %d\n",sai); kaisu[sai]++; } for(i=1;i<7;i++){ kakuritu[i] = kaisu[i] / 1000; printf("%dが出た確率は%f",i,kakuritu[i]); } return 0; } こんな感じだと思います。何か間違えがあったらすみません。 kaisuに1~6が出た回数を記憶し、kaisu[1] / 1000で1が出た確率を求められます。

eku6fexdd
質問者

お礼

実行できました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • naoya0302
  • ベストアンサー率39% (13/33)
回答No.4

すみません。キャストを忘れてました。 kakuritu[i] = (float)kaisu[i] / 1000.0;

全文を見る
すると、全ての回答が全文表示されます。
  • syonep
  • ベストアンサー率26% (64/242)
回答No.2

int me[6]; にしておいて、 me[sai-1]++; をforに入れて、 break後に、 forでiくらいを1~6まで回して、 printf("%dがでた確率は、%fです\n",i+1, (float)me[i]/1000); くらいでどうでしょう? 文法等は見直して下さいね^^;

eku6fexdd
質問者

お礼

できました。すみません初歩的な質問をして。 どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • arl_may
  • ベストアンサー率27% (9/33)
回答No.1

#include<stdio.h> #include<stdlib.h> int main() { int sai, i; //目毎にカウント数を入れる配列を宣言する for(i = 1; i=< 1000; i++) { sai = rand() % 6 + 1; //出た目毎にカウント(+1)する printf("出た目は = %d\n",sai); } /* for文で1から6を回す{ 出た目毎のカウント数/1000を出力する } */ return 0; }

eku6fexdd
質問者

お礼

できました。ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • すごろくに使用するサイコロ

    以下の問題についてお願いします。 すごろくに使用するサイコロの目を生成するプログラムを作成せよ。 rand関数を用いて1から6の整数乱数を発生させ表示させるとともに、以下のルールに従う表示を行うこと。 サイコロの目が1の場合には「mouikkai」と表示する サイコロの目が4の場合には「ikkai yasumi」と表示する このルールに従い、サイコロを20回振った場合の結果を示せ。 randを用いて以下のように考えましたが、補足をお願いします。 #include <stdio.h> #include <stdlib.h> void main (void) /*サイコロ*/ { int i,x; for(i=0;i<20;i++){ x=(int)(6*(rand()/32767.1)+1); printf("%d",x); } }

  • C言語でサイコロのプログラムを作ってみたのですが

    まず、以下のような”実行するたびに1~6の数字をランダムに出力するプログラム”を 作ってみたのですが、特定の数字が出てこないのです。 例えば、1と4、2と5、3と6 が出ない ここで気がついた事は、 1、出ない目の2数の差は3であること。 2、乱数自体を表示させたところ、ちゃんと1秒毎に乱数は変わっている。こちらには問題はない 3、約1分間隔で、出ない数字の組み合わせが変わる。 (例えば 1,3,4,6,1,6,3,6,4(2と5が出ない)  →1分間実行し続けると・・・  2,3,6,5,3,2,2,6(1と4が出ない)) この原因は一体なんなのでしょうか・・・ とても気になって仕方がありません。わかる方教えてください。 以下、ソースコードになります #include<stdio.h> #include<time.h> #include<stdlib.h> int func(void); int main(void){ int number=0; number=func(); //サイコロの目の表示 printf("%d\n",number); return 0; } int func(){ //乱数の初期化 srand((int unsigned)time(NULL)); //サイコロの目をランダムで出力し、返す return rand()%6+1; } プログラムの仕組みは パソコンから現在の歴時刻を元に乱数の初期値を変更 ↓ rand関数で適当な値を受け取り、6で割った余剰+1を計算し値を返却する

  • C言語

    下のようにするだけでなぜ、画面上に数字が表示されるのでしょうか? #include <stdio.h> #include <stdlib.h> #define KOSU 100 void main(void) { int ary[KOSU]; int key; int i; for (i = 0; i < KOSU; i++){ ary[i] = rand(); printf("%8d", ary[i]); } }

  • C言語のプログラムでおかしな動作をするのですが教えて頂けないでしょうか?

    VisualStudio2008使用しています。 問題は、サイコロを200回振ってその出た目の数の個数分*を表示するプログラムです。 サイコロの目はランダムで出しています。 次のプログラムは正常に動作するものです。 /* #include <stdio.h> #include<stdlib.h> #include<time.h> #define N 200 int DICE(int min,int max); int main() { int n,i,j; int y[7]={0}; srand((unsigned int)time(NULL)); for(i=0;i<N;i++){ n=DICE(1,6); y[n]++; } for(i=1;i<7;i++){ printf(" %2d: ",i); for(j=0;j<y[i];j++){ printf("*"); } printf("\n"); } return 0; } int DICE(int min,int max) { return min+(int)(rand()*(max-min+1.0)/(1.0+RAND_MAX)); } */ 次のプログラムが問題で、授業で先生が配列にはstaticをおまじないとしてつけないと暴走すると言われたので、つけて見ると明らかに間違ってると思われるプログラムで動作するのですが原因を教えて頂けないでしょうか? 以下問題のプログラム! 配列の前にstaticをつけたら、添え字をいくつにしても正常に動作します。普通は添え自分しか領域って確保されないですよね??? /* #include <stdio.h> #include<stdlib.h> #include<time.h> #define N 200 int DICE(int min,int max); int main() { int n,i,j; //以下が問題の配列宣言 static int y[2]={0}; srand((unsigned int)time(NULL)); for(i=0;i<N;i++){ n=DICE(1,6); y[n]++; } for(i=1;i<7;i++){ printf(" %2d: ",i); for(j=0;j<y[i];j++){ printf("*"); } printf("\n"); } return 0; } int DICE(int min,int max) { return min+(int)(rand()*(max-min+1.0)/(1.0+RAND_MAX)); } 質問の意味が正確に伝わらなかった場合は補足しますので、ご回答よろしくお願いします。

  • C言語 スロットみたいにするやり方が分かりません

    今自由課題でスロットのように数字を乱数で表示させて、Enterを押すと押したときの値を表示させたいです しかし、今書いているやつだとなぜかスロットみたいに数字の表示ができません。 おそらくif文で一旦止まってしまっていると思うのですが、どこが悪いのか教えてください。 #include <stdio.h> #include <stdlib.h> int main(){ int a,b,c; srand(time(NULL)); c = getchar(); b = rand()%6+1; for(;;){ a = rand()%6+1; printf("\033[H\033[J"); printf("%d",a); if(getchar() == '\n'){ printf("あなたのサイコロの値は%dです!!\n",a); break; }else{ continue; } } return 0; }

  •  現在、私はC言語を学んでいます。

     現在、私はC言語を学んでいます。  プログラミングの初期の初期の問題なんですが、 「Hello World」という有名なプログラムがありますよね? それについての質問です。 #include<stdio.h> main() { printf("Hello World"); return 0; } も #include<stdio.h> main(void) { printf("Hello World"); return 0; } も #include<stdio.h> int main() { printf("Hello World"); } もちゃんと表示できます。 ここで質問です。 int main(void) int main() main() main(void) はどう違うんですか? あと、 return 0; はあっても無くてもいいようなんですが どういう意味があるんでしょうか?

  • C言語でこのプログラムを完成させるには

    C言語でこのプログラムを完成させるには C言語初心者です。 1~6の乱数を100回発生させて、それぞれの出現回数をカウントし、ヒストグラムとして表示するプログラムを作成したいのですが上手くいきません。 #include <stdio.h> #include <time.h> #include <stdlib.h> int rnd(int m, int n) { return (int)(n-m+1)*(rand()/(RAND_MAX+0.1))+m; } int main(void) { int i, j, r; int hist[7]; for (i=1; i<7; i++) hist[i]=0; srand((unsigned)time(NULL)); for (i=0; i<100; i++) { r=6; while (6-- > 0) putchar('*'); putchar('\n'); } for (i=1; i<7; i++) { printf("%2d:", i); for (j=0; j<hist[i]; j++) printf("*"); printf("\n"); } return 0; } 何がいけないのでしょうか? よろしくお願いします。

  • C言語で乱数がうまく効きません。下記のソースでコンパイルして実行すると

    C言語で乱数がうまく効きません。下記のソースでコンパイルして実行すると結果が130固定となってしまいます。 #include <stdio.h> #include <stdlib.h> int main(void){ int x; x = rand(); printf("%d",x); return 0; } 使っているコンパイラはBorland C++ 5.5.1です。何か間違いでもあるのでしょうか?よろしくお願いします。

  • 20マスのスゴロクをプログラミングしたいのですが、

    20マスのスゴロクをプログラミングしたいのですが、 20マス丁度でないと上がれないようにしたいです。 #include<stdio.h> #include <stdlib.h> #include <time.h> main() { srand((unsigned) time(NULL)); int sai, rest=19, masu=1; while(masu != 20){ sai= rand() % 6 + 1; printf("サイコロ %d、",sai); masu +=sai; rest -=sai; if(masu<20){ printf("今のマス %2d、 ",masu); printf("残り %2d\n",rest);} else if(masu==20) { printf("上がり\n",sai);} else { printf("上がれない\n",sai);} } return(0); } ここまでは出来たのですが、うまく実行できず上がれないが無限ループしてしまいます。 どのようにしたらうまくいくでしょうか? 教えてください!

  • C言語で分からないところがあるのですが・・・

    すみません。C言語で分からないところがあったので来ました。 ユーザから数字を任意の数だけ受け取って、その数字とその和を表示するプログラムです。atoiなる関数、そしてコマンドライン引数というのを使って考えてみた結果を下に書きましたので、どなたか修正してください。お願いします。 実行結果(のイメージ図) 20 39 4 sum 20 39 4 63 途中までのソースコードです。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main(int argc,char *argv[]) { int sum; int n,i; printf("How many numbers INPUT?: "); scanf("%d", &n); for(i = 0; i <= n; i++){ atoi(argv[i]); } sum = printf("%d",sum); return 0; }