是否可以在C ++中预测rand()

时间:2010-05-24 15:38:55

标签: c++ random

  

可能重复:
  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

...

5 个答案:

答案 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

这是一篇非常有趣的文章,描述了一些低成本的随机数生成器