实施集中分布曲线

时间:2016-10-11 18:13:35

标签: c# math unity3d random logic

我正在研究一个项目,我需要在10个深度级别上映射可变数量的元素(例如12到18之间)。到目前为止,这里不用担心。

困扰我的是:我们目前正在考虑实施这一分配的集中点,但我不知道如何干净利落地完成。

在上述情况中,总共12-18个元素分布在10个级别上。但是随着浓度的增加,我们需要将大部分元素映射到浓度的深度(比如深度4)。

我意识到这意味着我们正在创造一个钟形曲线,但我无法找到一种干净利落的方式来实现它,尽可能少的剩余风险。我毕竟在游戏加载时运行了几百次。

编辑:以下是所需内容的一个示例。

数量:18

  • 等级1:3
  • 等级2:2
  • 等级3:2
  • 等级4:5
  • 等级5:3
  • 等级6:2
  • 等级7:1
  • 等级8:0
  • 等级9:0
  • 等级10:0

1 个答案:

答案 0 :(得分:1)

嗯,明确的一种方法是使用带峰值的离散分布,泊松可能是一个不错的选择

样本泊松最多9,如果它高于9拒绝并重新取样。否则将它移1并返回。

一些基于MathDotNet

的伪代码
using MathNet.Numerics.Distributions;

int Sample(Random rng, double lambda) {
    for( ;; ) {
        int r = Poisson.Sample(rng, lambda);
        if (r < 10)
            return r+1;
    }
    return -1;
}

检查Poisson distribution的模式,很明显,对于4的峰值,你必须在3到4之间lambdalambda=3,你&#39;在3和4的采样中得到两个相等的峰值,对于lambda=4,您将在4和5处获得两个峰值(请记住移位1)。只需使用它并尝试将其设置为适合您要求的内容