Random.nextGaussian()的问题

时间:2009-03-10 11:47:04

标签: java random

Random.nextGaussian()应该给出随机数no.s,平均值为0,std偏差为1。 它产生的许多nos超出了[-1,+ 1]的范围。 我该如何设置,以便它只在-1到1的范围内给出正态分布的随机数。

6 个答案:

答案 0 :(得分:17)

平均值为0且标准差为1的高斯分布意味着分布的平均值为0,并且约70%的总体位于[-1,1]范围内。忽略超出范围的数字 - 它们在两边形成约16%的边缘。

也许更好的解决方案是使用mean=0std.dev=0.5生成分发。这将为您提供大约96%的[-1,1]范围内的值的分布。

更好的解决方案是如上所述向后工作并使用大约的想法。 99.7%的值位于3-sigma范围内:使用std.dev = 1/3。这几乎会使您获得的不太有用的数量无效。当你得到一个,省略它。

当然,如果你正在研究数学密集型产品,那么所有这些都没有价值。

答案 1 :(得分:10)

正态分布是否包含与平均值任意相距的数字,但概率越来越小?可能是您的愿望(正常且限于特定范围)不相容。

答案 2 :(得分:6)

正态分布给出一个非零(但“变得非常小”)的概率,看到[-1,+ 1]之外的值无论你给出什么方差 - 你只是有效地压扁曲线。

你可以使用一个小的方差,然后通过一个地图运行结果,该地图裁剪任何小于-1到-1的东西,以及任何大于1比1的东西,但它(严格来说)不会是正态分布更多。

出于兴趣,你需要这个发行版什么?

答案 3 :(得分:2)

使用您的参数进行高斯分布。密度为e ^( - x ^ 2/2)。一般来说,它的形式为e ^(线性(x)+线性(x ^ 2)),这意味着你提供的任何设置,你都有可能获得非常大和非常小的数字。
您可能正在寻找其他分发。

答案 4 :(得分:1)

1.0的标准差意味着许多值将位于[-1,1]范围之外。

如果你需要保持在这个范围内,你应该使用另一种方法,也许是nextDouble()。

答案 5 :(得分:1)

此代码将向控制台显示 count 个随机高斯数字(一行中有10个),然后显示一些统计数据(最低,最高和平均)。

如果您使用小计数编号进行尝试,随机数可能在[-1.0 ... + 1.0]范围内,平均值可以在[-0.1 ... +0.1]范围内。但是,如果 count 高于10.000,则随机数可能会落在[-4.0 ... +4.0]范围内(两端可能出现更多不可能的数字),尽管平均值可能在[ - 0.001 ... +0.001](接近0)。

public static void main(String[] args) {
    int count = 20_000; // Generated random numbers
    double lowest = 0;  // For statistics
    double highest = 0;
    double average = 0;
    Random random = new Random();

    for (int i = 0; i < count; ++i) {
        double gaussian = random.nextGaussian();
        average += gaussian;
        lowest = Math.min(gaussian, lowest);
        highest = Math.max(gaussian, highest);
        if (i%10 == 0) { // New line
            System.out.println();
        }
        System.out.printf("%10.4f", gaussian);
    }
    // Display statistics
    System.out.println("\n\nNumber of generated random values following Gaussian distribution: " + count);
    System.out.printf("\nLowest value:  %10.4f\nHighest value: %10.4f\nAverage:       %10.4f", lowest, highest, (average/count));
}