为什么当我在两台机器上同时在C中运行rand()时,我得到了相同的结果?

时间:2014-05-24 01:45:25

标签: c random

当我在两台不同的机器上同时运行以下代码时,我得到相同的结果。为什么他们是一样的,我怎么能让他们与众不同?

for (int i = 0; i < 10; i++)
{
    delay[i] = (rand() % 2000) + 100;
    printf("random number: %i\n", delay[i]);
}

使用

时结果相同
 srand(time(NULL));

我的理解是rand()使用处理器计时器生成随机数,但我怎样才能摆脱它?

5 个答案:

答案 0 :(得分:4)

srand()种子或设置随机数生成器的初始状态。我认为您遇到的问题是因为time()通常只有1秒的分辨率。可以在1秒内启动两个程序,这样它们都可以获得相同的起始种子。

您可能会尝试使用更高分辨率的时钟(可能无法解决问题)或操作系统特定的种子随机源。

答案 1 :(得分:1)

生成器不是真正随机的,它只是根据起始种子和最后检索的值运行计算。因此,如果您在多台计算机上为生成器设置相同的值(您只是使用时钟作为种子,但您可以从任何源提供值),您将获得相同的结果。生成器是否在内部使用处理器计时器是一个实现细节,而不是保证。

答案 2 :(得分:0)

就像Blastfurnace所说,timer()函数的分辨率为1秒,因此您可以使用更精细的分辨率来解决此问题。试试吧:

struct timeval time; 
gettimeofday(&time,NULL);

srand((time.tv_sec * 1000) + (time.tv_usec / 1000));
祝你好运!

答案 3 :(得分:0)

对于没有模偏置使用的自播安全等级随机性

delay[i] = arc4random_uniform( 2000 ) + 100;

答案 4 :(得分:0)

你的种子在两台机器上是相同的,然后顺序是相同的。时间的粒度是不够的。您应该尝试找到另一个随机源。在许多现代系统(至少类似Unix)上,你有一个/dev/random伪文件,你可以读取它来获取随机字节。使用它非常不可能获得相同的字节序列。