web-dev-qa-db-ja.com

time.hで関数srand()を使用するには?

私のプログラムには、実行するたびにランダムな正の整数を生成するコードが含まれています。乱数を生成しますが、一度だけです。その後、同じコードを実行すると同じ値が得られ、コードが役に立たなくなります。

Rand関数から始めて、srand()関数をtime.hヘッダーファイルと共に使用しましたが、それでもそうではありません正常に動作しています。

#define size 10
for(i=0;i<size;i++)
    Arr[i] = Rand()%size;

最初の呼び出し(ランダム):

6 0 2 0 6 7 5 5 8 6

2回目の呼び出し(ランダムだが前と同じ):

6 0 2 0 6 7 5 5 8 6

後でStack Overflowの質問にアクセスし、srand()関数について読んで、次のように使用しました。

#include<time.h>
for(i=0;i<size;i++)
    Arr[i] = srand(time(NULL));

最初の呼び出し:

-10327 -10327 -10327 -10327 -10327 -10327 -10327 -10327 -10327 -10327

2回目の呼び出し:

-10326 -10326 -10326 -10326 -10326 -10326 -10326 -10326 -10326 -10326

それは私に異なるものを与えています(ランダムな値ではありません)。 Arr [i]をunsigned intと定義しましたが、それでも負の値を取得しています。

11
Đēēpak

srand()onceを呼び出してシードをランダム化し、ループでRand()を呼び出す必要があります。

#include <stdlib.h>
#include <time.h>

#define size 10

srand(time(NULL)); // randomize seed

for(i=0;i<size;i++)
    Arr[i] = Rand()%size;
37
Paul R

Rand()の前にrandomize()を呼び出して、ランダムジェネレーターを初期化してください。

(見てください: srand()—なぜ一度だけ呼び出すのですか?

4
Ze..

srandを選択した場合は、Rand()を使用する前に少なくとも1回呼び出すことをお勧めします。これは、恐ろしい原始的な擬似乱数ジェネレータの一種です。スタックオーバーフローの質問なぜRand()%7は常に0を返すのですか?を参照してください。

srand(time(NULL));
Rand();
//Now use Rand()

利用可能な場合は、randomまたはarc4Rand の方がいい。

1
Grady Player