problem with Random.nextGaussian()

前端 未结 6 2015
别跟我提以往
别跟我提以往 2021-01-12 19:58

Random.nextGaussian() is supposed to give random no.s with mean 0 and std deviation 1. Many no.s it generated are outside range of [-1,+1]. how can i set so that it gives n

相关标签:
6条回答
  • 2021-01-12 20:17

    This code will display count number of random Gaussian numbers to console (10 in a line) and shows you some statistics (lowest, highest and average) afterwards.

    If you try it with small count number, random numbers will be probably in range [-1.0 ... +1.0] and average can be in range [-0.1 ... +0.1]. However, if count is above 10.000, random numbers will fall probably in range [-4.0 ... +4.0] (more improbable numbers can appear on both ends), although average can be in range [-0.001 ... +0.001] (way closer to 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));
    }
    
    0 讨论(0)
  • 2021-01-12 20:19

    Gaussian distribution with your parameters. is has density e^(-x^2/2). In general it is of the form e^(linear(x)+linear(x^2)) which means whatever settings you give it, you have some probability of getting very large and very small numbers.
    You are probably looking for some other distribution.

    0 讨论(0)
  • 2021-01-12 20:40

    A Gaussian distribution with a mean 0 and standard deviation one means that the average of the distribution is 0 and about 70% of the population lies in the range [-1, 1]. Ignore the numbers that are outside your range -- they form the fringe 16% approx on either side.

    Maybe a better solution is to generate a distribution with mean=0 and std.dev=0.5. This will give you a distribution with about 96% of the values in the range [-1, 1].

    An even better solution is to work backward as above and use the idea that approx. 99.7% of the values lie in the 3-sigma range: use a std.dev = 1/3. That will almost nullify the amount of not-so-useful values that you are getting. When you do get one, omit it.

    Of course, if you are working on a math intensive product, all of this bears no value.

    0 讨论(0)
  • 2021-01-12 20:42

    A normal distribution gives a non-zero (but "becoming extremely small") probability of seeing values outside [-1, +1] whatever variance you give - you're just squishing the curve, effectively.

    You could use a small variance and then just run the results through a map which cropped anything less than -1 to -1, and anything greater than 1 to 1, but it wouldn't (strictly speaking) be a normal distribution any more.

    What do you need this distribution for, out of interest?

    0 讨论(0)
  • 2021-01-12 20:42

    A standard deviation of 1.0 entails that many values will lie outside the [-1,1] range.

    If you need to keep within this range, you should use another method, perhaps nextDouble().

    0 讨论(0)
  • 2021-01-12 20:44

    Doesn't the normal distribution include numbers arbitrarily far from the mean, but with increasingly small probabilities? It might be that your desires (normal and limited to a specific range) are incompatible.

    0 讨论(0)
提交回复
热议问题