C++ C++;RNG(梅森捻线机)需要种子
我已经编写了一个包含不同算法的RNG类,但是它不能像预期的那样工作。除了我希望使用正态(而不是均匀)分布这一事实之外,我的代码总是返回相同的数字(最大值),或者只返回间隔[min,max]外的2个数字: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,
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:你是对的!现在,当我一次性创建引擎、分发和种子时,它就可以工作了!(要编辑我的问题…)