Java 为什么这个生成随机数的程序不断生成数百个数字?

Java 为什么这个生成随机数的程序不断生成数百个数字?,java,arrays,math,random,Java,Arrays,Math,Random,我有一个关于数组的非常简单的问题。我一直在看一些教程,不明白为什么下面的代码将频率输出作为1**的随机组合。它从来没有给出像5,67,541之类的数字,它总是给出像150,175,183之类的数字。我希望我能说清楚。非常感谢 代码: 这是正常的。频率为5将是非常不寻常的,因为这意味着该数字在1000次中仅滚动了5次。您得到的数字约为1000卷中的1/6,因此六个数字中的每一个都在大约六分之一的时间内滚动。这是正常的。频率为5将是非常不寻常的,因为这意味着该数字在1000次中仅滚动了5次。您得到的

我有一个关于数组的非常简单的问题。我一直在看一些教程,不明白为什么下面的代码将频率输出作为1**的随机组合。它从来没有给出像5,67,541之类的数字,它总是给出像150,175,183之类的数字。我希望我能说清楚。非常感谢

代码:


这是正常的。频率为5将是非常不寻常的,因为这意味着该数字在1000次中仅滚动了5次。您得到的数字约为1000卷中的1/6,因此六个数字中的每一个都在大约六分之一的时间内滚动。

这是正常的。频率为5将是非常不寻常的,因为这意味着该数字在1000次中仅滚动了5次。您得到的数字约为1000次总滚动的1/6,因此六个数字中的每一个都在大约六分之一的时间内滚动。

因为您循环1000次的偏差非常小


如果只循环10次,但将循环中的数字增加100,则会得到更高的偏差。

因为循环1000次,偏差非常小


如果只循环10次,但循环中的数字增加100,则偏差会更大。

这实际上是一个数学问题,而不是编程问题

掷骰子有六种可能的结果,你掷骰子1000次。这意味着,如果你想看到一个不是“100和X”形式的数字,你需要看到一个数字中的200或更多,或者一个数字中的99或更少。您看到每个数字的预期次数为1000/6=166.7,因此为了看到200或更多的数字,您需要偏离真实值+33.3或-66.7。这可能发生;这很少见

我写了一个程序,模拟这样的掷骰子,直到你得到一个这样的骰子,并计算你需要掷多少次骰子。在做了1000次之后,我发现平均来说,你需要掷骰子53次,然后你才能看到一个不是100的数字。代码如下:

import java.util.*;

public class DiceRolls {
    /* The number of trials to run. */
    private static final int NUM_TRIALS = 1000;

    public static void main(String[] args) {
        Random rand = new Random();

        int totalRuns = 0;
        for (int i = 0; i < NUM_TRIALS; i++) {
            totalRuns += runsUntilEvent(rand);
        }
        System.out.println(totalRuns / (double)NUM_TRIALS);
    }

    private static int runsUntilEvent(Random rand) {
        /* Track how many tries we needed. */
        int numTries = 0;
        while (true) {
            numTries++;

            /* Rather than indexing from 1 to 6, I'm indexing from 0 to 5. */
            int freq[] = new int[6];            
            for(int roll = 0; roll < 1000; roll++){
                ++freq[rand.nextInt(6)];
            }

            /* See if this isn't in the hundreds. */
            for(int face = 0; face < freq.length; face++){                
                if (freq[face] >= 200 || freq[face] <= 99) {
                    return numTries;
                }
            }
        }
    }
}
import java.util.*;
公营骰子{
/*要运行的试验次数*/
私人静态最终int NUM_试验=1000;
公共静态void main(字符串[]args){
Random rand=新的Random();
int totalRuns=0;
对于(int i=0;i如果(freq[face]>=200 | | freq[face]这实际上是一个数学问题,而不是一个编程问题

掷骰子有六种可能的结果,你掷骰子1000次。这意味着如果你想看到一个不是“100 X”形式的数字您需要看到一个数字中的200个或更多,或者一个数字中的99个或更少。您看到每个数字的预期次数为1000/6=166.7,因此,为了看到200个或更多数字,您需要偏离真实值+33.3或-66.7。这可能会发生;这很少见

我写了一个模拟掷骰子的程序,直到你得到一个这样的骰子,并计算你需要掷骰子的次数。在做了1000次之后,我发现平均来说,你需要掷53次骰子,然后你才能看到一个不在一百的数字。下面是代码:

import java.util.*;

public class DiceRolls {
    /* The number of trials to run. */
    private static final int NUM_TRIALS = 1000;

    public static void main(String[] args) {
        Random rand = new Random();

        int totalRuns = 0;
        for (int i = 0; i < NUM_TRIALS; i++) {
            totalRuns += runsUntilEvent(rand);
        }
        System.out.println(totalRuns / (double)NUM_TRIALS);
    }

    private static int runsUntilEvent(Random rand) {
        /* Track how many tries we needed. */
        int numTries = 0;
        while (true) {
            numTries++;

            /* Rather than indexing from 1 to 6, I'm indexing from 0 to 5. */
            int freq[] = new int[6];            
            for(int roll = 0; roll < 1000; roll++){
                ++freq[rand.nextInt(6)];
            }

            /* See if this isn't in the hundreds. */
            for(int face = 0; face < freq.length; face++){                
                if (freq[face] >= 200 || freq[face] <= 99) {
                    return numTries;
                }
            }
        }
    }
}
import java.util.*;
公营骰子{
/*要运行的试验次数*/
私人静态最终int NUM_试验=1000;
公共静态void main(字符串[]args){
Random rand=新的Random();
int totalRuns=0;
对于(int i=0;i如果(freq[face]>=200 | | freq[face]输出是在每个“骰子卷”中找到一个数字的次数。就使用伪随机数生成而言,该数字生成被认为是“公平的”,因此您有一个“公平的骰子卷”,这意味着平均而言,每个数字在每个骰子卷上出现的机会均等

因此,每个数字的平均值应该是总转鼓数的1/6倍,这是您现在得到的结果


如果增加总掷骰数,每个数字之间的1/6偏差将更大,并与掷骰数类似地增加。

输出是在每个“骰子掷骰”中找到一个数字的次数。就使用伪随机数生成而言,数字生成被视为“公平”因此,你有一个“公平掷骰”,这意味着平均而言,每个数字都有均等的机会
import java.util.*;

public class DiceRolls {
    /* The number of trials to run. */
    private static final int NUM_TRIALS = 1000;

    public static void main(String[] args) {
        Random rand = new Random();

        int totalRuns = 0;
        for (int i = 0; i < NUM_TRIALS; i++) {
            totalRuns += runsUntilEvent(rand);
        }
        System.out.println(totalRuns / (double)NUM_TRIALS);
    }

    private static int runsUntilEvent(Random rand) {
        /* Track how many tries we needed. */
        int numTries = 0;
        while (true) {
            numTries++;

            /* Rather than indexing from 1 to 6, I'm indexing from 0 to 5. */
            int freq[] = new int[6];            
            for(int roll = 0; roll < 1000; roll++){
                ++freq[rand.nextInt(6)];
            }

            /* See if this isn't in the hundreds. */
            for(int face = 0; face < freq.length; face++){                
                if (freq[face] >= 200 || freq[face] <= 99) {
                    return numTries;
                }
            }
        }
    }
}
16, 26, 36, 46, 56, 66, 
61, 62, 63, 64, 65