Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的随机数与时间无关_C - Fatal编程技术网

C中的随机数与时间无关

C中的随机数与时间无关,c,C,有没有一种方法可以在c语言中生成与时间无关的随机数。 我的想法是,我希望一次生成一个随机数数组,但由于rand()方法依赖于时间,因此数组中的所有值都是以类似的方式生成的。rand()按顺序(按时间顺序)生成值,但不依赖于时间(如“一天中的时间”),除非使用srand(时间)为生成器种子(NULL))。如果不执行此操作,它将依赖于1(一) 还有rand_r()(POSIX)返回当前种子的值。通过保存和恢复适当的种子值,您可以使用它们来协调多个随机数流 对于不使用time(NULL)的非确定性种子

有没有一种方法可以在c语言中生成与时间无关的随机数。 我的想法是,我希望一次生成一个随机数数组,但由于rand()方法依赖于时间,因此数组中的所有值都是以类似的方式生成的。

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()
取决于时间”是什么意思?如果您通过编辑来解释更多您正在做的事情,您将摆脱一些反对票。