1

我一直在尝试寻找答案,但我发现的所有讨论要么是我不懂的语言,要么依赖于一个集合,其中每个元素都有自己的权重。

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

所以最后,我希望我可以调用(通过扩展方法)

random.NextWeighted(MIN, MAX, WEIGHT);
4

2 回答 2

4

您有一个可用的逆正态分布方法

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

  2. 将其传递给 InverseNormalDistribution。

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

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

  5. 如果小于 MIN,则返回 MIN。如果大于 MAX,则返回 MAX。否则,返回此值。

于 2011-10-03T21:42:10.180 回答
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 到十亿之间的数字,速度很快,但不是很实用。

于 2011-10-03T21:52:44.387 回答