加权随机数生成C#

时间:2011-10-03 21:35:32

标签: c# random weighted

我一直在努力寻找答案,但我发现的所有讨论都是用我不理解的语言,或者依赖于每个元素都有自己权重的集合。

我想基本上只得到一个介于0到10之间的随机数,这是“中等加权”,因为在5中经常出现的是0和10.基本上我一直试图找出一个算法,我可以给任何number是我定义的最小值和最大值之间的“加权数”,所有生成的数字都是适当加权的。我知道这可能听起来像“我不想想这个,我只是坐下来等待其他人这样做”,但我一直在思考和搜索这个一个小时,我真的迷路了:|

所以最后,我希望我可以打电话(通过扩展方法)

random.NextWeighted(MIN, MAX, WEIGHT);

2 个答案:

答案 0 :(得分:4)

您有inverse normal distribution method可用。

  1. 缩放您的随机数,使其在0和1之间为双倍。

  2. 将其传递给InverseNormalDistribution。

  3. 根据权重缩放返回的值。 (例如,按重量除以100。)

  4. 计算[(MIN + MAX)/ 2] + [(ScaledValue)X(MAX - MIN)]

  5. 如果小于MIN,则返回MIN。如果它超过MAX,则返回MAX。否则,请返回此值。

答案 1 :(得分:3)

我不知道你想要5比0-10之间的其他数字更频繁出现,但是你可以用你想要的发行版创建一个数组。

这样的东西
var dist = new []{0,1,2,3,4,5,6,7,8,9,10,5,5,5};

然后你得到0和13的随机位置,你会得到0-10之间的数字,但是比其他数字多5倍。如果你想要0到10亿之间的数字,那么速度很快但不太实用。