我想知道在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;作为输出。请解释一下这里发生了什么。
答案 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;中声明)。这足以满足大多数琐碎的随机需求。
所以:
如果您使用给定的种子初始化srand
,则以下rand
次调用将在整个运行中保持一致。
如果您使用基于时间的种子初始化srand
,则以下rand
次调用几乎肯定会在不同的运行中有所不同。
如果您未初始化srand
,则对rand
的以下调用将使用默认的初始种子。
请注意,在当代C ++中,您应该避免使用这些古老的函数。请参阅this question的答案。