如何用C#中的权重编写随机数生成器?

时间:2016-07-29 21:57:59

标签: c# algorithm math random

我正在尝试在C#中编写一个随机数生成器函数,该函数将采用最小最大权重参数。

如果权重== 0,结果将等于最小值,并且权重== 1,结果将等于最大值。当权重== 0.5时,范围内的所有数字都有相同的被选择机会。

我想要实现的是当重量接近最小值时,最小值有更多机会被选中而最大值更少,反之亦然。

3 个答案:

答案 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>