rand()没有给我一个随机数(即使使用srand())

Jon*_*cka 1 c++ random srand

好吧,我开始失去理智.我想做的只是随机的0到410之间的数字,根据这个页面,我的代码应该这样做.因为我想要一个随机数而不是伪随机数,所以我也使用srand(),例如这个线程告诉我这样做.但这不起作用.我得到的只是一个数字,取决于我上次执行以来的时间.如果我尽可能快地再次执行它,那么数字通常比最后一个数字高6个数字,如果我等待更长时间,它会更高,等等.当它达到410时,它会回到0并重新开始.我错过了什么?

编辑:哦,如果我删除该srand(time(NULL));行,我每次运行程序时都得到相同的数字(41).这甚至不是伪随机的,这只是一个静态数字.只是从我上面链接的文章复制第一行代码仍然给我41号.我是"23号"续集中的明星,还是我错过了什么?

int main(void) {

    srand(time(NULL));
    int number = rand() % 410;

    std::cout << number << std::endl;

    system("pause");

}
Run Code Online (Sandbox Code Playgroud)

Bau*_*gen 7

这就是使用弃用的随机数生成所得到的.

rand 产生一个固定的数字序列(这本身就很好),非常非常糟糕.

你告诉序列randsrand哪里开始.由于您的"起点"(称为种子顺便说一句)取决于自1.1.1970 0:00:00 UTC以来的秒数,因此您的输出显然是时间依赖的.

执行您想要执行的操作的正确方法是使用C++ 11 <random>库.在您的具体示例中,这看起来有点像这样:

std::mt19937 rng (std::random_device{}());
std::uniform_int_distribution<> dist (0, 409);

auto random_number = dist(rng);
Run Code Online (Sandbox Code Playgroud)

有关的罪恶的详细信息rand和优点<random>看看这个.

作为最后一句话,std::mt19937像我上面那样播种并不是最佳选择,因为MT的状态空间远大于单次调用中的32位std::random_device{}().这不是玩具程序和标准学校作业的问题,而是供参考:是我对MT整个州空间播种的看法,以及答案中的一些有用的建议.