2016-07-29 385 views
4

我想在C#中编写一个随机数生成器函数,这个函数需要最小值,最大值权值参数。如何用C#中的权重编写随机数生成器?

对于权重== 0,结果将等于最小值,并且权重== 1时,结果将等于最大值。在体重== 0.5的情况下,范围内的所有数字都有相同的选择机会。

我想达到的效果是随着体重接近最小值,最小值有更多的机会被选中,最大值减小,反之亦然。

+2

@Plutonix有几种不同的分布可以考虑,你似乎只考虑均匀分布 –

+2

有很多不同的方法可以解决这个问题,你可以举几个例子来说明函数应该如何处理0.1,0.25,0.66等权重。 ? –

+0

我无法确定其他权重产生的确切值,例如,如果权重为0.1,则最小值的概率为90%,最大值为10%,值i n之间将被相应地分配。但是,我不确定所有概率的总和是否应该超过100%,就像那样。 –

回答

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; 
+0

这是错误的,你的体重不仅影响概率,而且还影响幅度 –

+0

@SeverinPappadeux哎呀,谢谢!希望更正:)。 – AlexD

15

我有一个简短的教程描述如何做到这一点这里:

https://ericlippert.com/2012/02/21/generating-random-non-uniform-data/

摘要:

  • 国家通过你的权重参数参数的功能,使该概率分布函数
  • 使用微积分来集成该函数以获得累积分布函数
  • 将该函数反转以获取分位数函数
  • 实现分位数函数,并将均匀分布的随机源的输出传递给分位数函数。结果将是一个符合期望分布的随机源。
  • 将该函数转换为整数范围,并适当地舍入。
+0

这需要我花一些时间,但从粗略的角度来看,这似乎是我需要的。谢谢。 –

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的这种特殊的重新参数化可能并不完全是你想要的,但你可以玩类似的功能。