Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;RNG(梅森捻线机)需要种子_C++_Random_Distribution_Seed_Mersenne Twister - Fatal编程技术网

C++ C++;RNG(梅森捻线机)需要种子

C++ C++;RNG(梅森捻线机)需要种子,c++,random,distribution,seed,mersenne-twister,C++,Random,Distribution,Seed,Mersenne Twister,我已经编写了一个包含不同算法的RNG类,但是它不能像预期的那样工作。除了我希望使用正态(而不是均匀)分布这一事实之外,我的代码总是返回相同的数字(最大值),或者只返回间隔[min,max]外的2个数字: std::function<int(int, int)> mt19937 = [](int min, int max) -> int { std::uniform_int_distribution<int> distribution(min,

我已经编写了一个包含不同算法的RNG类,但是它不能像预期的那样工作。除了我希望使用正态(而不是均匀)分布这一事实之外,我的代码总是返回相同的数字(最大值),或者只返回间隔[min,max]外的2个数字:

std::function<int(int, int)> mt19937 =
    [](int min, int max) -> int {
        std::uniform_int_distribution<int> distribution(min, max);
        std::mt19937 engine;
        engine.seed(time(null));
        auto generator = std::bind(distribution, engine);
        return generator();
    };
std::函数mt19937=
[](int-min,int-max)->int{
标准:均匀分布(最小值、最大值);
标准:mt19937发动机;
engine.seed(时间(null));
自动生成器=标准::绑定(分配、引擎);
返回生成器();
};
有谁能解释一下,解决这个难题缺少了什么?此外,如何实现正态分布?上次我试过
std::normal_distribution
时,我无法输入边界


编辑:当我谈到正态分布时,我的意思是,两个边界附近的RNG结果不应像两个边界的平均值那样频繁生成。例如,查看标准高斯分布的图形表示。我之所以提到它,是因为它可视化了我想以这种方式实现/使用的结果值的概率,如果您理解的话。

正态分布就是这样(
x
是一个随机均匀数):

但我看到一些问题:

std::uniform_int_distribution<int> distribution(min, max);

此代码仅每秒更改一次,因此当您请求一个新的随机数时,它将仅每秒更改一次。

正态分布就是这样(
x
是一个随机均匀数):

但我看到一些问题:

std::uniform_int_distribution<int> distribution(min, max);

此代码仅每秒更改一次,因此当您请求一个新的随机数时,它将仅每秒更改一次。

正确。我想要这个骰子卷,这是不均匀的。在我的代码的某些部分,它们应该是正态的——因此我实现了一些不同类型的算法。正态分布是一种概率分布函数。所有的概率都严格小于一。如果你把它用于骰子,那么我建议去掉Mersenne twister,因为它适用于你请求数十亿个随机数的情况(比如我使用的渲染引擎)。您尝试过默认的C++ RNG吗?默认值为<代码>(s)RAND 工作如预期,但我希望像标准高斯分布图那样分布的值看起来是,如果您理解,不要生气,但问题可能是实现。你想要一个正态分布,但你似乎不知道它是什么。PDF(概率分布函数)的最大值为1,从
-inf
inf
的整数为1。它描述了某一范围的
x
值与之关联的概率。你想要什么样的正态分布?结果如何?你必须更具体一些,因为你所要求的是不可能的。我想要这个骰子卷,这是不均匀的。在我的代码的某些部分,它们应该是正态的——因此我实现了一些不同类型的算法。正态分布是一种概率分布函数。所有的概率都严格小于一。如果你把它用于骰子,那么我建议去掉Mersenne twister,因为它适用于你请求数十亿个随机数的情况(比如我使用的渲染引擎)。您尝试过默认的C++ RNG吗?默认值为<代码>(s)RAND 工作如预期,但我希望像标准高斯分布图那样分布的值看起来是,如果您理解,不要生气,但问题可能是实现。你想要一个正态分布,但你似乎不知道它是什么。PDF(概率分布函数)的最大值为1,从
-inf
inf
的整数为1。它描述了某一范围的
x
值与之关联的概率。你想要什么样的正态分布?结果如何?你必须更具体一些,因为你所要求的是不可能的。每次你想要一个新号码的时候,你都在创建和播种一个新引擎?也许你应该创建一次引擎和发行版,然后根据需要向他们索要新的数字。这不是重点。我想知道为什么这样不行!这可能就是它不起作用的原因。但关键是:如果你一直用时间(null)重新播种,它每秒只改变一次,每次你想要一个随机数,你就会得到相同的答案。@Blender:你是对的!现在,当我一次性创建引擎、分发和种子时,它就可以工作了!(要编辑我的问题…)每次你想要一个新号码时,你都在创建和播种一个新引擎?也许你应该创建一次引擎和发行版,然后根据需要向他们索要新的数字。这不是重点。我想知道为什么这样不行!这可能就是它不起作用的原因。但关键是:如果你一直用时间(null)重新播种,它每秒只改变一次,每次你想要一个随机数,你就会得到相同的答案。@Blender:你是对的!现在,当我一次性创建引擎、分发和种子时,它就可以工作了!(要编辑我的问题…)