用于c ++函数rand()的公式

时间:2016-01-24 10:25:15

标签: c++ random

我想知道在C ++中使用rand()函数生成随机数的公式是什么。起初我虽然每次都会返回随机数,但事实并非如此。

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    cout << "Hello world!" << endl;

    srand(9865);
    cout << rand() << "\n";
    return 0;
}

在这里,我想,也许是因为给定的种子数和未知的公式,它将显示相同的数字。

但是,当我删除&#34; srand(9865);&#34;并且执行几次它只显示&#34; 41&#34;作为输出。请解释一下这里发生了什么。

3 个答案:

答案 0 :(得分:2)

来自http://linux.die.net/man/3/rand

“如果没有提供种子值,则rand()函数会自动播种,值为1.”和“..这些序列可以通过使用相同的种子值调用srand()来重复。”

答案 1 :(得分:1)

每次都必须使用非静态种子为随机函数设定种子。一个简单但不那么准确的解决方案是用时钟播种:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    cout << "Hello world!" << endl;

    srand(time(NULL));
    cout << rand() << "\n";
    return 0;
}

答案 2 :(得分:1)

库规范并未规定随机数生成器的公式(由实现决定)。唯一指定的事情是可以通过srand来控制事物,以实现一致的伪随机生成:

  

为了生成类似随机数的数字,srand通常被初始化为一些独特的运行时值,如函数时间返回的值(在header&lt; ctime&gt;中声明)。这足以满足大多数琐碎的随机需求。

所以:

  1. 如果您使用给定的种子初始化srand,则以下rand次调用将在整个运行中保持一致。

  2. 如果您使用基于时间的种子初始化srand,则以下rand次调用几乎肯定会在不同的运行中有所不同。

  3. 如果您未初始化srand,则对rand的以下调用将使用默认的初始种子。

  4. 请注意,在当代C ++中,您应该避免使用这些古老的函数。请参阅this question的答案。