我正在尝试在C#中编写一个随机数生成器函数,该函数将采用最小,最大和权重参数。
如果权重== 0,结果将等于最小值,并且权重== 1,结果将等于最大值。当权重== 0.5时,范围内的所有数字都有相同的被选择机会。
我想要实现的是当重量接近最小值时,最小值有更多机会被选中而最大值更少,反之亦然。
答案 0 :(得分:15)
我有一个简短的教程,介绍如何在这里做到这一点:
https://ericlippert.com/2012/02/21/generating-random-non-uniform-data/
摘要:
答案 1 :(得分:0)
这是从[0, 1]
获得加权值的无限多种可能性:
Random rnd = new Random();
double weight = ...; // must be in [0, 1];
double r = rnd.NextDouble();
if (weight < 0.5)
val = 1 - Math.Pow(r, weight * 2);
else
val = Math.Pow(r, (1 - weight) * 2);
它可以映射到[min, max]
double val2 = val * (max - min) + min;
答案 2 :(得分:0)
我的建议是使用Beta distribution,找出导致期望行为的体重函数。
例如,假设支持介于0和1之间,并且权重$ w $也介于0和1之间.Beta有两个参数,$ \ alpha $和$ \ beta $。设$ \ alpha = 2 * w $和$ \ beta = -wlog_2(w) - (1-w)* log_2(1-2)$(恰好是binary entropy function。然后Beta退化对于权重0和1,重量为0.5的标准均匀,并给出其他权重值的有效连续分布。这个Beta的特定重新参数化可能不是您想要的,但您可以使用类似的功能。 / p>