重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

1から10の乱数を
2つ同時に表示しようとしてるのですが、
実行すると2つとも同じ数字になってしまいます。

また、あとでその乱数の合計(=point)
をだしたいのでx、yに乱数を代入したいのですがどのように
したらいいのでしょうか??
心やさしい方、お願いします。

#include <stdio.h>
#include <stdlib.h>
int dice(void);
int dice2(void);


main()
{

int x=0,y=0,point;



printf("start this game\n");
printf("here is your card\n");

x=dice();
y=dice2();
point=x+y;
printf("your card is %d and %d point is %d\n",x,y,point);


return 0;
}




/*ka-do1*/

int dice(void){
srand(time(NULL));
return 1+(rand() % 10);


}


/*ka-do2*/
int dice2(void){
srand(time(NULL));
return 1+(rand() % 10);


}

A 回答 (6件)

★アドバイス


・秒単位で違う数値がほしい場合は、前回の乱数を srand に与えれば簡単に異なる数値を
 取得できます。そのほか、前回の乱数と発生させる乱数で演算を適当に行う方法もあります。
・下にそのサンプルを載せておきます。

サンプル:
int main( void )
{
 int i;
 
 srand( time(NULL) ); ←初期化
 
 for ( i = 1 ; i <= 10 ; i++ ){
  printf( "%d回目⇒%d\n", i, (myrand(10) + 1) ); ←10回とも違う数値
 }
}

// 秒単位で違う乱数を発生
int myrand( int range )
{
 static int save;
 
 save += rand(); ←『+、-、×、÷、&、|、^』などの演算子に変えると面白い
 return (save % range);
}

その他:
・擬似乱数を自分で作成してみると良い。
 作り方は簡単で適当な数式を使って上位16ビット、下位16ビットを乱数として返せばよい。
 つまり、
 int myrand( long seed )
 {
  static long random;
  
  if ( seed != 0 ){
   random = seed;
  }
  random = (random * 1234567 + 31); ←適当な数式
  return (int)((random >> 16) & 0x7FFF); ←上位15ビットを戻す
 }
 使い方
 printf( "rand=%d\n", myrand(0) ); ←普通に乱数を発生
 printf( "rand=%d\n", myrand(56789) ); ←seed を与えてから乱数を発生
・上記で紹介した myrand() 関数を使えば続けて呼び出しても異なる数値を取得できます。
 また、time() 関数を引数に与えると強制的に seed を変更できます。
・以上。今後の参考に。
    • good
    • 0
この回答へのお礼

みなさん本当にありがとうございました!!!!

こんなプログラミングを全然知らない私に

丁寧に教えてくださってとても嬉しいです!!!!!

そして今回のことをキッカケにプログラミングが好きに

なりました!!!!

まだまだ、初心者ですが今後もよろしくおねがいします☆★

お礼日時:2007/06/24 23:33

処理系が不明ですが...



srand関数は起動時に一回だけ呼べば十分です。すでに指摘されているように、time関数の分解能未満の間隔で複数回呼び出せば、その都度同じ乱数種で初期化されてしまいます。

なお、time関数が返す値は処理系に依存します。分解能は秒単位のことが多いですが、ミリ秒単位であっても、年単位であっても、Cの規格上はOKです。要求されているのは処理系最良の近似値という努力目標でしかありませんので、常に実装者の娘の誕生日が帰ってきても、(性能上の問題はありますが)やはりCの規格上はOKです。さらに、暦時間が使用できることも必須ではないので、その場合は常に(time_t)-1が返ってきます。
というわけで、処理系は必ず明記しましょう。
    • good
    • 0

質問とは関係ないのですが気になったので


dice( )とdice2( )は同じ内容の関数ですよね
dice2( )はいらないのではないでしょうか
    • good
    • 0

/*ka-do1*/か/*ka-do2*/のどちらかのsrand(time(NULL))を


srand(time(NULL)+1)とするかあるいはmain関数の中で
乱数の種を変えて各関数に送り乱数を発生させればいいと思います

#include <stdio.h>
#include <stdlib.h>
int dice(void);
int dice2(void);

main()
{

int x=0,y=0,point;

printf("start this game\n");
printf("here is your card\n");

srand((unsigned)time(NULL));
x=dice();
y=dice2();

point=x+y;
printf("your card is %d and %d point is %d\n",x,y,point);
return 0;
}

/*ka-do1*/
int dice(void){
return 1+(rand() % 10);
}
/*ka-do2*/
int dice2(void){
return 1+(rand() % 10);
}

こんなかんじで大丈夫だと思うんですけど(^^;
    • good
    • 0

srand( )に同じ値を入れると同じ乱数が発生します


dice( )とdice2( )を連続して実行しているためtime(NULL)が同じ値になり乱数が同じになっているのでしょう
srand( )をmain( )関数で1回だけ実行するようにし、dice( )とdice2( )のsrand( )を削除したらよいでしょう
    • good
    • 0

心は優しくないですが・・・。



srand(time(NULL));
は乱数の時刻による初期化ですよね。
time()の精度は秒ですから、
おそらくdice()とdice2()を読んだときの時刻が、
同じ時刻になり、同じ初期値から生成される乱数なので
同じ値になるのではないでしょうか。

多分、srand(time(NULL));をprintf("start this game\n");の
前に持っていき、dice(), dice2()からsrand()を消せば
うまくいくような気がします。(試してません。)

> x、yに乱数を代入したい
とりあえず書かれているコードで良いと思いますよ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!