生成概率分布

Yuv*_*dam 18 java random math probability

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

一个可能的结果可能是:

0     1     2     3     4
0.15  0.2   0.18  0.22  0.25
Run Code Online (Sandbox Code Playgroud)

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

0     1     2     3     4
0.01  0.01  0.96  0.01  0.01
Run Code Online (Sandbox Code Playgroud)

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

Kob*_*obi 22

获得n个随机数,计算它们的总和,并通过将每个数除以总和来将总和标准化为1.

  • 这引入了偏见.您不能以这种方式均匀地从单纯形式中采样. (12认同)
  • 本文的图2 - http://www.cs.cmu.edu/~nasmith/papers/smith+tromble.tr04.pdf - 给出了n = 3情形归一化方法中偏差的直观描述你提议.我相信kohomologie的答案是正确的(虽然我没有检查它们包含的代码). (4认同)

via*_*tic 16

您要完成的任务等同于从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;
    }
Run Code Online (Sandbox Code Playgroud)

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

  • 在大多数语言中,你应该只创建一次"随机",或者你不会得到随机结果(在很多情况下 - 反复使用相同的数字).我也关注`log`的使用 - 你能解释它为什么存在吗? (3认同)