すごろくに使用するサイコロの目生成プログラム

このQ&Aのポイント
  • すごろくに使用するサイコロの目を生成するプログラムを作成しましょう。ランダムな1から6の整数を表示するだけでなく、特定のルールに従った表示も行いましょう。
  • サイコロの目が1の場合には「mouikkai」と表示し、目が4の場合には「ikkai yasumi」と表示します。
  • このプログラムを使って、20回のサイコロの結果を表示してみましょう。
回答を見る
  • ベストアンサー

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

以下の問題についてお願いします。 すごろくに使用するサイコロの目を生成するプログラムを作成せよ。 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); } }

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

  • ベストアンサー
  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.2

もう一回になったときや、一回休みになったとき、駒の位置はどう動くのでしょう。その辺のルールがあやふやですね。 #include <stdio.h> #include <time.h> #include <stdlib.h> int main(void) { int n, i, pos; pos = 0; srand(time(NULL)); for (i = 0; i < 20; i++) { n = (int) (6.0 * rand() / RAND_MAX) + 1; printf("%4d: saikoro = %d, pos = %d\n", i, n, pos); switch (n) { case 1: printf("mouikkai\n"); pos++; i--; break; case 4: printf("ikkaiyasumi\n"); pos += 4; i++; break; default: pos += n; } } printf("last pos = %d\n", pos); return 0; }

その他の回答 (1)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

まずは 32767.1 がどこから出てきたのかを補足にどうぞ。 また、おきまりの指摘として srand() で初期化しましょう。

destinatio
質問者

補足

srandを使ってするべきでした。 また(double)rand()/32767.0とすると 0から1.0の実数乱数を作るために使用しました。 #include <stdio.h> #include <stdlib.h> #include<time.h> void main (void) /*サイコロ*/ { int i,x,iseed; iseed=(int)time(NULL); srand(iseed); for(i=0;i<20;i++){ x=(int)(6*((double)rand()/((double)RAND_MAX+1))+1); printf("%d\n",x); switch(x){ case 1: printf("mou ikkaix=%d\n",x); break; case 4: printf("ikkai yasumix=%d\n",x); break; } } } 長いですけどできました。 お騒がせしまして申し訳ございません。

関連するQ&A

  • 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.…です。」と表示するプログラムを追加するにはどうすればいいのですか?

  • 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]); } }

  • rand関数について

    rand関数で取得した乱数を入力し、入力した逆の順番に表示しなさい、という問題があるのですが。一度乱数のプログラムを作り、その後逆に表示するプログラムというのは分かるのですが、そのあとがどうしても分かリません。 一般に、この場合は先ず。 #include <stdio.h> #include <stdlib.h> int main(void) { int i; for(i=1;i<==10;i++){ printf("%d",rand()%10+1); { return 0; } の表示をして、新たに逆にする表示をすると思うのですが、どのパターンを使うのが無難なのでしょうか? できれば 式を含めてお願いします。

  • 分からないです(;_;)

    分からないです(;_;) 1 さいころを振り出た目を返す(1~6の乱数を返す)ユーザ関数int dice(void)と、そのユーザ関数int dice(void)を用いてスタートからゴールまで一本道のすごろくを行うユーザ関数int sugoroku(int goal, int toss_max, int *toss_count)を作成せよ。int sugoroku(int goal, int toss_max, int *toss_count)は以下の条件をつける。 ・さいころを振るたびに、出た目と進んだ後のマスを表示する。 ・goalをゴールとし、ゴールにちょうど止まらなかった場合、ゴールを越えた分だけ戻る。 ・さいころをtoss_max回振るまでにゴールできた場合には1を返し、toss_max回振ってもゴールできなかった場合は0を返す。 ・さいころを振った回数の合計をtoss_countに入れる。 そして、実行結果例のように、goalとtoss_maxを入力するとすごろくを行って結果を表示するプログラムを作成する。 乱数を使用するときはstdlib.hをインクルードし、rand()を用いることで実現可能。 乱数の範囲を指定するには以下の公式を用いる。 最小値+(int)( rand() * (最大値 - 最小値 + 1.0) / (1.0 + RAND_MAX)) <実行結果> input goal. 11 input toss_max. 5 sugoroku start! pip = 2, mass = 2 pip = 4, mass = 6 pip = 5, mass = 11 goal!! toss_count = 3 input goal. 11 input toss_max. 5 sugoroku start! pip = 2, mass = 2 pip = 3, mass = 5 pip = 4, mass = 9 pip = 5, mass = 8 pip = 1, mass = 9 failure...

  • 正規乱数をエクセルに

    正規乱数を発生させるプログラムを作ったのですが、これをエクセルに出力させるにはどのようにすればよいのでしょうか?すみませんが教えてください(__) #include<stdio.h> #include<stdlib.h> #include<math.h> void ran(double,double,double *); void main(void) {   int i;   double x;   for(i=0;i<1000;i++){     ran(1.0,0.0,&x);       printf("%f\n",x);      } } void ran(double sig,double m,double *x) {   double r1,r2;   r1=rand()/32767.1;   r2=rand()/32767.1;   *x=sig*sqrt(-2*log(r1))*sin(2*3.141592*r2)+m; }

  • 毎回違う乱数を生成するにはどうしたらいいでしょうか

    C言語の初心者です。よろしくお願いいたします! 乱数に関する質問:毎回違う乱数を生成するにはどうすればいいでしょうか。 学校の講義の中に  >>time() は1970 年1 月1 日0 時0 分(標準時)からの経過秒数を返 すため,1 秒以内に何度も実行すると,同じ数字で乱数を初期化す ることになり,結果も同じになってしまう. という記述がありますが、時間を置いてから、実行しても同じ結果となりました。 その一 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> int main(void) { double x,y; int i,index=0; double a,n; printf("How many trials?..."); scanf("%lf",&n); for (i=0;i<n;i++) { x=rand()/(RAND_MAX+1.0); y=rand()/(RAND_MAX+1.0); if((x*x+y*y)<1) index++;} a=4*index/n; printf("Result is %.2f(%.2f)",a,sin(-a)); return 0; } その二 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int a; srand((unsigned)time(NULL)); a=(int)(rand()/(RAND_MAX+1.0)*10); printf("%d\n",a); 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です。何か間違いでもあるのでしょうか?よろしくお願いします。

  • 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)); } 質問の意味が正確に伝わらなかった場合は補足しますので、ご回答よろしくお願いします。

  • この円を分割して。。

    #include <stdio.h> #include <time.h> #include <stdlib.h> #define MAX 10000 void main(void) { int i; float x1, x2, en, sum=0.0, s; srand( (unsigned)time( NULL ) ); for(i=0;i<MAX;i++) { x1=((float)rand()/(float)RAND_MAX); x2=((float)rand()/(float)RAND_MAX); if(en=(x1-0.5)*(x1-0.5)+(x2-0.5)*(x2-0.5)<=(0.5)*(0.5)) { sum++; } } s=sum/MAX; printf("円の面積:%15.6e\n",s); } 円の面積を求める方法です。がもう少し精度をあげる工夫をしようと思うのですが、円を4分割した第一象限の部分に乱数をとばしその面積を求め、4倍することで求めたいのですがどうプログラムを変えたらいいか教えてください。