【发布时间】:2011-07-14 20:55:25
【问题描述】:
现在我使用以下代码来创建具有范围的整数的均匀分布。 (我把播种代码拿出来了)
int random(int min, int max)
{
static std::mt19937 gen;
std::uniform_int<int> dist(min, max);
return dist(gen);
}
我正在尝试修改它以提供有利于最小值的二分之一的分布,并且几乎从不会产生接近最大值的分布。我可以看到所有预制的分布,但它们都不是整数。而且我也无法根据任何文档判断哪个适合我的需求。我最接近的是维基百科上显示的卡方分布,其中 k=2
但我无法弄清楚,基于documentation如何将它与整数一起使用,更不用说设置k值了。
如何设置我的函数以使用适当的非均匀整数分布?
仍在努力选择正确的发行版:以下是 std::poisson_distribution<int> dist((max - min) * .1); 从 0 到 20 的结果:
还没有,因为 0 应该比 1 更频繁,但它应该可以帮助下一个人,他们会在他们到来时发布更多结果。
我的最终解决方案变成了多种方法的组合:
int randomDist(int min, int max)
{
static std::mt19937 gen;
std::chi_squared_distribution<double> dist(2);
int x;
do
{
x = (int)(max*dist(gen)/10) + min;
}
while (x > max);
return x;
}
给出结果:
【问题讨论】:
-
在泊松分布中,如果您选择小于 1 的参数(当前为 (20−0)*.1 = 2),0 将比 1 更频繁。您还可以通过具有任何参数的几何分布来获得它。您应该选择的模型取决于您要建模的内容:几何模型是事件发生之前的时间(例如,进球所需的射门次数),泊松模型是时间间隔内事件发生的次数(例如,次数比赛中的进球数)。
-
好吧,我将它用于实时遗传算法。当需要培育一种新生物时,我不会有不同的世代,而是根据适应度对它们进行排序,然后根据这条曲线选择父母。
-
@Zak – 如果您使用几何分布进行选择,那么您可以将每个父母的选择描述为#1 vs (#2 的获胜者 vs (#3 的获胜者 vs ... )),其中 #i 以概率 p 战胜任何 #j,i
-
@Zak:在我看来,您的图表仍然是负指数分布;我会直接使用它。
-
@Matteo & @Zak – 是的,
chi_square_distribution(2)是一个与exponential_distribution(.5)相同的特殊情况。此外,max*exponential_distribution(.5)/10与exponential_distrubtion(max*.5/10)相同,floor(exponential_distribution(max*.5/10))与geometric_distribution(1-exp(-max*.5/10))相同。
标签: c++ random distribution