c ++随机数不是随机的

时间:2016-09-08 03:51:39

标签: c++ random

我正在尝试使用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之间随机变化?

由于

3 个答案:

答案 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()进行比较,但一般来说,伪随机数发生器通过播种一次然后生成一系列号。