代码之家  ›  专栏  ›  技术社区  ›  Satbir

RAND()在C++中可预测[复制]

  •  3
  • Satbir  · 技术社区  · 15 年前

    可能重复:
    What’s the Right Way to use the rand() Function in C++?

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

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

    18467

    6334

    15724

    ......

    5 回复  |  直到 8 年前
        1
  •  11
  •   Rakis    15 年前

    是和否。rand()是一个伪随机数生成器,给定相同的种子值,它将始终返回相同的数字序列。通常情况下,一个“种子”随机数生成器与一些随机数据,然后使用rand()返回一个看似随机数序列。如果您的随机数据不需要用于要求“真正”随机性的事情(例如基于密码的安全性),那么使用当前系统时间就足够了。但是,如果您是出于安全目的使用它,请研究从熵收集实用程序中获取更真实的随机数据,并使用它来为随机数生成器播种。

    如aa所述,seed函数被引用 here

        2
  •  5
  •   Michael Dorgan    15 年前

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

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

        3
  •  3
  •   Meh    15 年前

    http://msdn.microsoft.com/en-us/library/sxtz2fa8%28VS.80%29.aspx

    你也可以使用 /dev/urandom CryptGenRandom() 在窗口上获取高质量的随机数。

        4
  •  2
  •   rkellerm    15 年前

        5
  •  1
  •   Robben_Ford_Fan_boy    15 年前

    从讨论“真”随机数开始。如前所述,任何有种子的发生器都有一个可预测的周期——我相信它可以是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

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