C中的随机数与时间无关

时间:2013-06-02 19:56:56

标签: c

有没有办法用c语言生成随机数,与时间无关。 我的想法是我想一次生成一个随机数组,但由于rand()方法依赖于时间,所以数组中的所有值都是相似的。

2 个答案:

答案 0 :(得分:9)

rand()不依赖于时间。人们通常使用当前时间(通过srand()函数)播种他们的伪随机数生成器,但他们没有必要。您可以将所需的任何数字传递给srand()

如果你的随机数不是一个足够高的质量(libc的rand因其不足而臭名昭着),你应该看看其他随机性来源。在大多数操作系统上,只需阅读/dev/random(或/dev/urandom)即可获得高质量的随机数据,Windows API提供CryptGenRandom。还有很多跨平台的库提供高质量的PRNGS; OpenSSL is one of them

答案 1 :(得分:3)

rand()按顺序生成值 (按时间顺序),但不依赖于时间(如“一天中的时间”),除非您使用{{{{ 1}}。如果你不这样做,它取决于srand(time(NULL))(一)。

还有1(POSIX)返回当前种子的值。通过保存和恢复适当的种子值,您可以使用它们来协调随机数的多个

对于不使用rand_r()的非确定性种子,您可能不得不求助于系统特定的源(在unix上time(NULL))。


不惜一切代价执行此操作,并继续使用/dev/random替代myrand()。这将在每个时钟秒期间为每个呼叫返回相同的值。

rand()

如果您致电unsigned myrand() { // BAD! NO! srand(time(NULL)); // re-seeding destroys the properties of `rand()` return rand(); } ,则应该在程序开头 一次

srand()的顺序确定性实际上是测试程序非常有用的属性。你得到的是一个(几乎)随机但可重复的序列。如果在程序开头打印出种子值,则可以重复使用相同的值来生成相同的结果(例如,如果它在该运行中不起作用)。