有没有办法在 C 语言中生成与时间无关的随机数。这个想法是我想一次生成一个随机数数组,但是由于 rand() 方法依赖于时间,所以数组中的所有值都是以类似方式生成的。
2 回答
rand()
doesn't depend on time. People typically seed their pseudo-random number generator using the current time (through the srand()
function), but they don't have to. You can just pass whatever number you want to srand()
.
If your random numbers aren't of a high enough quality for your purposes (libc's rand
is notorious for its inadequacy), you should look at other sources of randomness. On most operating systems, you can get high-quality random data just by reading from /dev/random
(or /dev/urandom
), and the Windows API provides CryptGenRandom
. There are also a lot of cross-platform libraries that provide high-quality PRNGS; OpenSSL is one of them.
rand()
按顺序(按时间顺序)生成值,但不依赖于时间(如“一天中的时间”),除非您使用srand(time(NULL))
. 如果你不这样做,它取决于1
(一)。
还有rand_r()
(POSIX)返回当前种子的值。您可以通过保存和恢复适当的种子值来使用它们来协调多个随机数流。
对于不使用的非确定性种子,time(NULL)
您可能不得不求助于系统特定的源(/dev/random
在 unix 上)。
不惜一切代价不要这样做,并继续myrand()
用作rand()
. 这将在每个时钟秒内为每个调用返回相同的值。
unsigned myrand() { // BAD! NO!
srand(time(NULL)); // re-seeding destroys the properties of `rand()`
return rand();
}
如果你调用srand()
,它应该只在程序开始时调用一次。
的顺序确定性rand()
实际上是测试程序的一个非常有用的属性。你得到的是一个(几乎)随机但可重复的序列。如果您在程序开始时打印出种子值,则可以重复使用相同的值来产生相同的结果(例如,如果它在该运行中不起作用)。