C中的随机数与时间无关
有没有一种方法可以在c语言中生成与时间无关的随机数。 我的想法是,我希望一次生成一个随机数数组,但由于rand()方法依赖于时间,因此数组中的所有值都是以类似的方式生成的。C中的随机数与时间无关,c,C,有没有一种方法可以在c语言中生成与时间无关的随机数。 我的想法是,我希望一次生成一个随机数数组,但由于rand()方法依赖于时间,因此数组中的所有值都是以类似的方式生成的。rand()按顺序(按时间顺序)生成值,但不依赖于时间(如“一天中的时间”),除非使用srand(时间)为生成器种子(NULL))。如果不执行此操作,它将依赖于1(一) 还有rand_r()(POSIX)返回当前种子的值。通过保存和恢复适当的种子值,您可以使用它们来协调多个随机数流 对于不使用time(NULL)的非确定性种子
rand()
按顺序(按时间顺序)生成值,但不依赖于时间(如“一天中的时间”),除非使用srand(时间)为生成器种子(NULL))
。如果不执行此操作,它将依赖于1
(一)
还有rand_r()
(POSIX)返回当前种子的值。通过保存和恢复适当的种子值,您可以使用它们来协调多个随机数流
对于不使用time(NULL)
的非确定性种子,您可能必须求助于特定于系统的源代码(unix上的/dev/random
)
无论如何不要这样做,继续使用
myrand()
替换rand()
。这将在每个时钟秒内为每个调用返回相同的值
unsigned myrand() { // BAD! NO!
srand(time(NULL)); // re-seeding destroys the properties of `rand()`
return rand();
}
如果调用srand()
,它应该在程序开始时只一次
rand()
的顺序决定论实际上是测试程序的一个非常有用的属性。你得到的是一个(几乎)随机但可重复的序列。如果你在程序开始时打印种子值,你可以重复使用相同的值来产生相同的结果(就像它在运行时不起作用一样)。rand()
不依赖于时间。人们通常使用当前时间(通过函数)为伪随机数生成器设定种子,但他们不必这样做。您只需传递想要的任何数字srand()
如果您的随机数的质量不足以满足您的需要(libc的
rand
因其不足而臭名昭著),您应该查看其他随机性来源。在大多数操作系统上,您只需从(或/dev/uradom
)读取即可获得高质量的随机数据,并且Windows API提供。还有许多跨平台库提供高质量的PRNG;您所说的“rand()
取决于时间”是什么意思?如果您通过编辑来解释更多您正在做的事情,您将摆脱一些反对票。