可能重复:
What’s the Right Way to use the rand() Function in C++?
当我运行以下程序时,我每次都会得到相同的值。兰特不是真正的随机函数吗?
int main()
{
while(1)
{
getch();
cout<<rand()<<endl;
}
}
在每次运行中,我得到以下值。
41
18467
6334
26500
19169
15724
...
答案 0 :(得分:11)
是和否。 rand()是一个伪随机数生成器,它将始终返回给定相同种子值的相同数字序列。通常一个'种子'随机数生成器带有一些随机数据,然后使用rand()返回一系列看似随机的数字。如果对于需要“真正”随机性的事物(例如基于加密的安全性)不需要随机数据,那么仅使用当前系统时间就足够了。但是,如果您出于安全目的使用它,请考虑从熵收集实用程序中获取更多真正的随机数据,并使用它来为随机数生成器播种。
如上所述,种子函数被引用here
答案 1 :(得分:5)
什么是真正的随机函数?最后我检查过,计算机无法做到这一点:)
至于为什么每次都得到相同的数字集,这是因为你需要使用一些起始的“随机”值为内置数字生成器播种。有很多地方可以做到这一点,但有些人看起来很好,但结果很糟糕。在我们的游戏中,我们通常从游戏启动到第一或第二个用户输入的时间播种。用户输入总是会因许多抽搐而变化,因此可以作为一个不错的起点。
答案 2 :(得分:3)
如果您使用的是Microsoft编译器,则可以使用rand_s,它可以生成非常好的随机数(就像只有计算机一样好):http://msdn.microsoft.com/en-us/library/sxtz2fa8%28VS.80%29.aspx
您还可以在Linux上使用/dev/urandom
,在Windows上使用CryptGenRandom()
来获取高质量的随机数。
答案 3 :(得分:2)
或将srand()放在函数的开头。
答案 4 :(得分:1)
仅仅依据对“真实”随机数的讨论。如前所述,任何有种子的发电机都有可预测的时期 - 我相信它可能是2 ^ 48。
如果该级别的随机性,您可以使用以下内容:
long randomLong(unsigned int x)
{
x ^= (x << 21); // x is a non zero seed value
x ^= (x >> 35);
x ^= (x << 4);
return x;
}
这取自以下文件: http://www.jstatsoft.org/v08/i14/paper
这是一篇非常有趣的文章,描述了一些低成本的随机数生成器