生成总和为 1 的 N 个数字

2022-09-02 19:48:45

给定一个大小数组,我想为每个索引生成随机概率,以便nSigma(a[0]..a[n-1])=1

一个可能的结果可能是:

0     1     2     3     4
0.15  0.2   0.18  0.22  0.25

另一个完全合法的结果可能是:

0     1     2     3     4
0.01  0.01  0.96  0.01  0.01

如何轻松快速地生成这些?任何语言的答案都很好,Java是首选。


答案 1

获取 n 个随机数,计算其总和,并通过将每个数字除以总和来将总和归一化为 1。


答案 2

您尝试完成的任务等于从 N 维单位单纯形绘制一个随机点。

http://en.wikipedia.org/wiki/Simplex#Random_sampling 可能会对您有所帮助。

一个幼稚的解决方案可能如下:

public static double[] getArray(int n)
    {
        double a[] = new double[n];
        double s = 0.0d;
        Random random = new Random();
        for (int i = 0; i < n; i++)
        {
           a [i] = 1.0d - random.nextDouble();
           a [i] = -1 * Math.log(a[i]);
           s += a[i];
        }
        for (int i = 0; i < n; i++)
        {
           a [i] /= s;
        }
        return a;
    }

为了从 N 维单位单纯形中均匀地绘制一个点,我们必须取一个指数分布随机变量的向量,然后通过这些变量的总和对其进行归一化。为了得到一个指数分布的值,我们取一个均匀分布值的负数。log


推荐