C++ rand()在C++;

C++ rand()在C++;,c++,random,C++,Random,可能重复: 当我运行下面的程序时,每次都会得到相同的值。兰德不是真正的随机函数吗 int main() { while(1) { getch(); cout<<rand()<<endl; } } intmain() { 而(1) { getch(); cout是和否。rand()是一个伪随机数生成器,在给定相同种子值的情况下,它将始终返回相同的数字序列。通常,一个“种子”随机数生成器使用一些随机数据,然后使用rand()返回一个看似随机的数字序列。如果需

可能重复:

当我运行下面的程序时,每次都会得到相同的值。兰德不是真正的随机函数吗

int main()
{

 while(1)
 {
 getch();
 cout<<rand()<<endl;
 }

}
intmain()
{
而(1)
{
getch();
cout是和否。rand()是一个伪随机数生成器,在给定相同种子值的情况下,它将始终返回相同的数字序列。通常,一个“种子”随机数生成器使用一些随机数据,然后使用rand()返回一个看似随机的数字序列。如果需要“真正”随机性的东西不需要随机数据(例如基于密码的安全性)仅使用当前系统时间就足够了。但是,如果出于安全目的使用它,请考虑从熵收集实用程序中获取更真实的随机数据,并使用这些数据为随机数生成器种子


正如aa所提到的,seed函数是引用的

如果您使用的是Microsoft编译器,您可以使用rand_s,它可以生成非常好的随机数(就像您仅用一台计算机就能得到的那样):


您还可以在Linux上使用
/dev/uradom
,在Windows上使用
CryptGenRandom()
,以获得高质量的随机数。

或将srand()放在函数开头。

什么是真正的随机函数?上次我检查时,计算机无法做到这一点:)


至于为什么每次都会得到相同的一组数字,这是因为你需要在内置数字生成器中植入一些起始“随机”值。有很多地方可以获得这个值,但有些地方看起来不错,但结果却不好。在我们的游戏中,我们通常从游戏启动到第一次或第二次用户输入都会使用tic时间进行植入。用户input在许多TIC中总是不同的,因此可以作为一个不错的起点。

从讨论“真”随机数开始。如前所述,任何有种子的生成器都有一个可预测的周期-我相信它可以是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;
}
long randomLong(无符号整数x)
{
x^=(x>35);

x^=(x@aaa:为什么不把它作为一个答案发布?@mmy我以为链接只会放在评论中?@aaa:它们也可以放在一个答案中。你应该这样做。你会因此得到更多的信任。这实际上不是一个bug。可复制性是一个简化调试和测试的功能。例如,我会在描述我使用的生成器时,将你指向Boost.Random库它明确指出,如果在相同的条件下运行,它们应该提供相同的输出。对于cyptography,请确保您的随机数生成器是合适的——要求与其他随机数用途有所不同。更好的是,使用您的操作系统中的随机数生成器,或者使用cyrpto++之类的已建立库。如果您创建自己的随机数生成器,您可能会得到这是错误的。谢谢你的回答,这有助于我更好地理解好的观点Richard,我忽略了提到这一点。OpenSSL库也是加密强随机数生成器的良好来源。