我正在尝试使用c ++生成随机数,但它们似乎不是很随机。我当然知道它们只是伪随机的,但我发现它实际上甚至不是伪随机的。这是我的代码
#include <iostream>
#include <time.h>
int main(){
srand (time(NULL));
std::cout << (double) rand() / (double) RAND_MAX;
return 0;
}
我从编译和运行这个cpp文件得到的结果总是从0.63开始,然后是一些看似随机的数字。
有什么我想念的吗?我没有使用srand正确初始化随机数生成器吗?为什么数字在0和1之间随机变化?
由于
答案 0 :(得分:4)
看起来编译器上rand
的实现非常差,其中初始随机值高度依赖于种子值。在开始使用返回值之前,您可以生成并丢弃几个随机值。
或者,更好的是,不要致电rand
。使用<random>
标题提供的工具。
答案 1 :(得分:2)
您可以尝试this:
struct timeval;
gettimeofday(&time, NULL);
srand(hash3(time.tv_sec, time.tv_usec, getpid()));
hash3:
unsigned int hash3(unsigned int h1, unsigned int h2, unsigned int h3)
{
return ((h1 * 2654435789U) + h2) * 2654435789U) + h3;
}
答案 2 :(得分:0)
根本问题在于,{C}手册将rand()
描述为&#34;坏随机数生成器&#34;。您应该使用<random>
库。参见
What difference between rand() and random() functions?
此外,目前还不清楚你是否故意仅将发电机播种后产生的第一个值与srand()
进行比较,但一般来说,伪随机数发生器通过播种一次然后生成一系列号。