73556


C言語で乱数を生成するプログラムをコーディングしているのですが、シード値を時間から指定しているため、１秒以内にプログラムを実行すると、同じシード値となり、同じ乱数が生成されてしまいます。

[code]

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main(void)
    {
        srand((unsigned int)time(NULL)); // 1秒以内に実行すると同じシード値になってしまいます
    
        // 最小値:0 取得個数:10個
        printf("%d\n", 0 + rand() % 10);
    
        return 0;
    }
    
[/code]

プログラムを１秒以内に何度も実行するので、１秒以内に実行されても異なるシード値になるようにしたいのですが、なにかいい方法はありますか？


CC BY-SA 4.0
2021-01-23T13:14:47.520
73527
2021-02-20T06:17:46.703
2021-02-20T06:17:46.703
3060
43413
question
c random
１秒以内に実行をくりかえすと同じシード値になる問題を解決したい


プラットフォームがわかりませんが、[`getpid`](https://linuxjm.osdn.jp/html/LDP_man-
pages/man2/getpid.2.html) とかをXORしてはどうでしょう？


CC BY-SA 4.0
2021-01-23T14:17:28.627
73530
2021-01-23T14:17:28.627
4236
73527
answer


英語版での関連しそうな投稿から、いくつか使えそうなものを紹介しておきます。

sayuri さんが回答している通り、`getpid` と組み合わせる方法。

[srand(time(NULL)) doesn't change seed value quick enough - Stack
Overflow](https://stackoverflow.com/a/17799756)

>
[code]

>     srand( (unsigned) time(NULL) * getpid());
>  
[/code]

もしくは時間の精度をマイクロ秒まであげる方法などがあるようです。

[srand() — why call it only once? - Stack
Overflow](https://stackoverflow.com/a/7343909)

>
[code]

>     struct timeval t1;
>     gettimeofday(&t1, NULL);
>     srand(t1.tv_usec * t1.tv_sec);
>  
[/code]


CC BY-SA 4.0
2021-01-23T16:34:10.050
73533
2021-01-23T16:34:10.050
3060
73527
answer


乱数のシード値に、現在時刻のミリ秒を使ったらいいのでは無いでしょうか？


CC BY-SA 4.0
2021-01-24T00:37:19.260
73538
2021-01-24T00:37:19.260
24490
73527
answer


Accept された後ではありますが

`srand()` に渡す値が大差ないときには `rand()` の初回呼出しが返す値を下手な加工して使うと乱数にならない例が既に知られています。  
[c言語での乱数生成](https://ja.stackoverflow.com/questions/12003)  
`time(NULL)` に `getpid()` の結果を **加える** 程度だと上記例のような環境だと明らかにまずいです。また `pid_t`
の取る値の範囲が狭い処理系 (FreeBSD や HPUX) では **XOR**
してもたいした違いにならないのでやはりあまりよろしくないです。というわけで `srand(time(NULL))`
はあまり良いプラクティスではありません。避けるべきでしょう。

ではどうすれば良いかは処理系によって異なります。とりあえず

  * `srand()` 直後の `rand()` は採用しない（数回~数十回読み捨てる)
  * もっとましな乱数種として `/dev/random` 乱数デバイスを使う (存在するなら)
  * もっとましな乱数列（と種）に乗り換える (MT とか)

あたりが推奨でしょうか。


CC BY-SA 4.0
2021-01-25T02:57:31.983
73556
2021-01-25T02:57:31.983
8589
73527
answer