
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);
}
No.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 を変更できます。
・以上。今後の参考に。
みなさん本当にありがとうございました!!!!
こんなプログラミングを全然知らない私に
丁寧に教えてくださってとても嬉しいです!!!!!
そして今回のことをキッカケにプログラミングが好きに
なりました!!!!
まだまだ、初心者ですが今後もよろしくおねがいします☆★
No.5
- 回答日時:
処理系が不明ですが...
srand関数は起動時に一回だけ呼べば十分です。すでに指摘されているように、time関数の分解能未満の間隔で複数回呼び出せば、その都度同じ乱数種で初期化されてしまいます。
なお、time関数が返す値は処理系に依存します。分解能は秒単位のことが多いですが、ミリ秒単位であっても、年単位であっても、Cの規格上はOKです。要求されているのは処理系最良の近似値という努力目標でしかありませんので、常に実装者の娘の誕生日が帰ってきても、(性能上の問題はありますが)やはりCの規格上はOKです。さらに、暦時間が使用できることも必須ではないので、その場合は常に(time_t)-1が返ってきます。
というわけで、処理系は必ず明記しましょう。
No.3
- 回答日時:
/*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);
}
こんなかんじで大丈夫だと思うんですけど(^^;
No.2
- 回答日時:
srand( )に同じ値を入れると同じ乱数が発生します
dice( )とdice2( )を連続して実行しているためtime(NULL)が同じ値になり乱数が同じになっているのでしょう
srand( )をmain( )関数で1回だけ実行するようにし、dice( )とdice2( )のsrand( )を削除したらよいでしょう
No.1
- 回答日時:
心は優しくないですが・・・。
srand(time(NULL));
は乱数の時刻による初期化ですよね。
time()の精度は秒ですから、
おそらくdice()とdice2()を読んだときの時刻が、
同じ時刻になり、同じ初期値から生成される乱数なので
同じ値になるのではないでしょうか。
多分、srand(time(NULL));をprintf("start this game\n");の
前に持っていき、dice(), dice2()からsrand()を消せば
うまくいくような気がします。(試してません。)
> x、yに乱数を代入したい
とりあえず書かれているコードで良いと思いますよ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
最早開始時間と最遅完了時刻を...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
【C++】関数ポインタの使い方
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
(マルチスレッド)_beginthrea...
-
C言語での奇数の和
-
CStringの配列要素を関数で受け...
-
未解決の外部シンボル _printf...
-
C言語でのプログラム
-
int16_t の _t は何?
-
PowerShellがうまくいかない
-
式は定数値が必要です」という...
-
if と配列の組み合わせ
-
2次元配列とポインタの引数受け...
-
C言語のプログラム作成について
-
【C++】行列データの読み込み
-
数字列を3桁ごとにカンマで区切...
-
部分行列の抜き出し(C言語)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
#define _CRT_SECURE_NO_WARNIN...
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
複数桁10進数の*桁目だけを抽出...
-
return 1L
-
if と配列の組み合わせ
-
ラップ関数とはどんなものですか?
-
式は定数値が必要です」という...
-
数字列を3桁ごとにカンマで区切...
-
実数の整数部,小数部の取得
-
C言語でDxlibを使って3x3の奇数...
-
プログラムについて(UNIX)
-
acceptをalarmでタイムアウトさ...
-
C言語の課題です
-
エラー 添字が付けられた値が、...
-
CStringの配列要素を関数で受け...
-
最早開始時間と最遅完了時刻を...
-
入力された数字を大きい順に並...
おすすめ情報