Java 为什么这个生成随机数的程序不断生成数百个数字?
我有一个关于数组的非常简单的问题。我一直在看一些教程,不明白为什么下面的代码将频率输出作为1**的随机组合。它从来没有给出像5,67,541之类的数字,它总是给出像150,175,183之类的数字。我希望我能说清楚。非常感谢 代码: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次。您得到的
这是正常的。频率为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