gpt4 book ai didi

c++ - 多次播种伪随机数生成器的问题?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:17:53 26 4
gpt4 key购买 nike

我已经看到很多关于每次执行时不要多次为伪随机数生成器播种的建议,但从未伴随过详尽的解释。当然,很容易看出为什么以下 (C/C++) 示例不是一个好主意:

int get_rand() {
srand(time(NULL));
return rand();
}

因为每秒多次调用 get_rand 会产生重复的结果。

但是下面的例子难道不是一个可以接受的解决方案吗?

MyRand.h

#ifndef MY_RAND_H
#define MY_RAND_H

class MyRand
{
public:
MyRand();
int get_rand() const;
private:
static unsigned int seed_base;
};

#endif

MyRand.cpp

#include <ctime>
#include <cstdlib>
#include "MyRand.h"

unsigned int MyRand::seed_base = static_cast<unsigned int>(time(NULL));

MyRand::MyRand()
{
srand(seed_base++);
}

int MyRand::get_rand() const
{
return rand();
}

main.cpp

#include <iostream>
#include "MyRand.h"

int main(int argc, char *argv[])
{
for (int i = 0; i < 100; i++)
{
MyRand r;
std::cout << r.get_rand() << " ";
}
}

即尽管 MyRand:s 构造函数被快速连续地调用了几次,但每次对 srand 的调用都有不同的参数。显然,这不是线程安全的,但 rand 也不是。

最佳答案

每次调用伪随机数生成器函数时,生成器都会获取一些内部状态并生成一个伪随机数和一个新的内部状态。转换内部状态的算法经过精心选择,因此输出看起来是随机的。

当您为随机数生成器设置种子时,您基本上就是在设置这个内部状态。如果您将内部状态重置为某个可预测的值,您将失去随机性的表象。

例如,流行的简单 RNG 是线性同余生成器。数字是这样生成的:

X[n+1] = (a X[n] + c) mod m

在这种情况下,X[n+1] 既是结果又是新的内部状态。如果您每次都按照上面的建议为生成器播种,您将获得如下所示的序列:

{(ab + c) mod m, (a(b+1) + c) mod m, (a(b+2) + c) mod m, ...}

其中 b 是您的 seed_base。这看起来一点也不随机。

关于c++ - 多次播种伪随机数生成器的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/976993/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com