- ベストアンサー
LSI C-86を利用した時の乱数の挙動について
C++の6.0を使っています。 srand((unsigned)time(NULL)); を使って1~9の乱数を作らせているのですが、 LSI C-86 Ver 3.30 試食版を使ってexeを作り、 作られた乱数を見ると 1の位置だけがランダムに決まり、 3 2 1 9 8 7 6 5 4 のように、他の数値は順番になってしまいます。 C++上で実行している時は、 全ての数値がランダムに配置されます。 これがどのような理由によるものなのか わかる方がいらっしゃいましたら、 その理由と解決策をお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
srand((unsigned)time(NULL)); をループの一番外に出してみて下さい. srand()というのは,乱数列を初期化するための関数なので, 通常1度だけ行えばよいです. コンパイラ依存の結果となったのは,srandによる乱数列の初期化方法が違うからだと思います.
その他の回答 (2)
- shogenji
- ベストアンサー率31% (31/98)
>srand((unsigned)time(NULL)); >を使って1~9の乱数を作らせている というのがよく分かりません. 実際の乱数生成はどのように行っているのでしょうか? srandを使わない場合は,どのようになりますか?
補足
1~9の乱数を作らせている、というのでは 少し表現に問題がありました。 1~9までの数値を作らせているのですが、 「同じ数値は2度出さない」も目的としています。 実際の乱数生成部分は、次のようになっています。 /*----------------------------------------------*/ for(i=0;i<3;i++) { for(j=0;j<3;j++) { while(ans_box[i][j]==0) { srand((unsigned)time(NULL)); r = rand() % 9 +1; for(k=0;k<=i;k++) { for(l=0;l<3;l++) { if(r == ans_box[k][l]){ flag = 1; } } } if(flag == 0){ ans_box[i][j] = r; } flag = 0; } } } /*----------------------------------------------*/ ans_box[3][3]という配列に、 一つずつ違った値の乱数を入れていきます。 ans_box、flagともに、初期値は全て0にしてあります。 前述の通り、C++上では問題なく動いているので、 LSI C-86を使った時に 何か問題が起きているのではないかと 考えているのですが、いかがなものでしょうか。 srandを使わないランダムな数値の生成に関しては 全く知識がありません。 srandを使うよりも良い方法があるのであれば、 そちらに関してもお願いします。
- KanjistX
- ベストアンサー率55% (48/86)
rand()の前にrandomize()という関数を行っているでしょうか。これがなければ毎回同じパターンになってしまうと聞きます。
補足
randomizeは私の環境では使用できないようです。 また、C++上で実行している時は パターンの無い、ランダムな列を返してくれることから お答えいただいた内容とは少し違う原因に あるのではないかと考えております。 ご回答、ありがとうございました。
お礼
仰った通りに変更を加えたところ、綺麗に動き、 また、乱数生成が劇的に早くなりました。 有難うございました。 うまく表現できませんが、すごく感謝しています。