当我在两台不同的机器上同时运行以下代码时,我得到相同的结果。为什么他们是一样的,我怎么能让他们与众不同?
for (int i = 0; i < 10; i++)
{
delay[i] = (rand() % 2000) + 100;
printf("random number: %i\n", delay[i]);
}
使用
时结果相同 srand(time(NULL));
我的理解是rand()使用处理器计时器生成随机数,但我怎样才能摆脱它?
答案 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
伪文件,你可以读取它来获取随机字节。使用它非常不可能获得相同的字节序列。