我想在C#中编写一个随机数生成器函数,这个函数需要最小值,最大值和权值参数。如何用C#中的权重编写随机数生成器?
对于权重== 0,结果将等于最小值,并且权重== 1时,结果将等于最大值。在体重== 0.5的情况下,范围内的所有数字都有相同的选择机会。
我想达到的效果是随着体重接近最小值,最小值有更多的机会被选中,最大值减小,反之亦然。
我想在C#中编写一个随机数生成器函数,这个函数需要最小值,最大值和权值参数。如何用C#中的权重编写随机数生成器?
对于权重== 0,结果将等于最小值,并且权重== 1时,结果将等于最大值。在体重== 0.5的情况下,范围内的所有数字都有相同的选择机会。
我想达到的效果是随着体重接近最小值,最小值有更多的机会被选中,最大值减小,反之亦然。
这是一个从可能性无限数量从[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;
这是错误的,你的体重不仅影响概率,而且还影响幅度 –
@SeverinPappadeux哎呀,谢谢!希望更正:)。 – AlexD
我有一个简短的教程描述如何做到这一点这里:
https://ericlippert.com/2012/02/21/generating-random-non-uniform-data/
摘要:
这需要我花一些时间,但从粗略的角度来看,这似乎是我需要的。谢谢。 –
我的建议是使用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的这种特殊的重新参数化可能并不完全是你想要的,但你可以玩类似的功能。
@Plutonix有几种不同的分布可以考虑,你似乎只考虑均匀分布 –
有很多不同的方法可以解决这个问题,你可以举几个例子来说明函数应该如何处理0.1,0.25,0.66等权重。 ? –
我无法确定其他权重产生的确切值,例如,如果权重为0.1,则最小值的概率为90%,最大值为10%,值i n之间将被相应地分配。但是,我不确定所有概率的总和是否应该超过100%,就像那样。 –