c++随机数不是随机的

c++ random numbers not random

本文关键字:随机 随机数 c++      更新时间:2023-10-16

我试图使用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之间随机的?

谢谢

看起来rand在编译器上的实现非常差,其中初始随机值高度依赖于种子值。在开始使用返回值之前,您可以生成和丢弃几个随机值。

或者,最好不要调用rand。使用<random>标头提供的功能

你可以试试:

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;
}

根本问题是rand()被C手册描述为"坏随机数生成器"。您应该使用<random>库。看到

rand()和random()函数有什么区别?

此外,如果您故意只比较srand()播种生成器后生成的第一个值,则不清楚,但通常,使用伪随机数生成器时,将它们播种一次,然后生成一系列数字。