• ベストアンサー

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++上で実行している時は、 全ての数値がランダムに配置されます。 これがどのような理由によるものなのか わかる方がいらっしゃいましたら、 その理由と解決策をお願いします。

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

  • ベストアンサー
  • shogenji
  • ベストアンサー率31% (31/98)
回答No.3

srand((unsigned)time(NULL)); をループの一番外に出してみて下さい. srand()というのは,乱数列を初期化するための関数なので, 通常1度だけ行えばよいです. コンパイラ依存の結果となったのは,srandによる乱数列の初期化方法が違うからだと思います.

Dread-Nought
質問者

お礼

仰った通りに変更を加えたところ、綺麗に動き、 また、乱数生成が劇的に早くなりました。 有難うございました。 うまく表現できませんが、すごく感謝しています。

その他の回答 (2)

  • shogenji
  • ベストアンサー率31% (31/98)
回答No.2

>srand((unsigned)time(NULL)); >を使って1~9の乱数を作らせている というのがよく分かりません. 実際の乱数生成はどのように行っているのでしょうか? srandを使わない場合は,どのようになりますか?

Dread-Nought
質問者

補足

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)
回答No.1

rand()の前にrandomize()という関数を行っているでしょうか。これがなければ毎回同じパターンになってしまうと聞きます。

Dread-Nought
質問者

補足

randomizeは私の環境では使用できないようです。 また、C++上で実行している時は パターンの無い、ランダムな列を返してくれることから お答えいただいた内容とは少し違う原因に あるのではないかと考えております。 ご回答、ありがとうございました。

関連するQ&A

専門家に質問してみよう