Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java for循环不会每次迭代到所需的数目_Java_Loops_For Loop_Iteration - Fatal编程技术网

Java for循环不会每次迭代到所需的数目

Java for循环不会每次迭代到所需的数目,java,loops,for-loop,iteration,Java,Loops,For Loop,Iteration,我正在处理一些Java初学者的问题,下面是一个我将输出10个随机生成的“抛硬币”的结果(使用Math.random() 由于某些原因,程序不会一直迭代到10。有时它会输出5个结果,或7个,或8个等等 迭代不总是恒定的原因是什么 public class Coin { public static void main(String[] args) { for (int i=0; i<11; i++) { if (Math.random() < 0.5)

我正在处理一些Java初学者的问题,下面是一个我将输出10个随机生成的“抛硬币”的结果(使用Math.random()

由于某些原因,程序不会一直迭代到10。有时它会输出5个结果,或7个,或8个等等

迭代不总是恒定的原因是什么

public class Coin
{
  public static void main(String[] args)
  {
    for (int i=0; i<11; i++)
    {
      if (Math.random() < 0.5)
      {
        System.out.println("H");
      }
      else if (Math.random() > 0.5)
      {
        System.out.println("T");
      }
    }
  }
}
公共级硬币
{
公共静态void main(字符串[]args)
{
对于(int i=0;i 0.5)
{
系统输出打印项次(“T”);
}
}
}
}

如果,你不需要第二个
——目前,在每次迭代中,如果你不打印
“H”
,你就投掷第二枚硬币,如果第二枚硬币是尾巴,你就只打印
“t”

应该是:

  if (Math.random() < 0.5)
  {
    System.out.println("H");
  }
  else
  {
    System.out.println("T");
  }
if(Math.random()<0.5)
{
系统输出打印项次(“H”);
}
其他的
{
系统输出打印项次(“T”);
}
使用原始代码时,头一次出现的几率为50/50,在这种情况下,您可以打印
“H”
。如果您没有抛出一个
“H”
(即其他50%的时间),您现在只有50/50的机会打印一个
“t”
,因此您只有25%的时间看到
“t”


因此,平均来看,您将看到7.5个结果,其中5个是
“H”
,2.5个是
“T”
。哦,除了你做了11次循环,倍数是1.1,你不需要第二个
——现在,在每次迭代中,如果你不打印
“H”
,你就扔第二个硬币,如果第二个硬币是尾巴,你就只打印
“t”

应该是:

  if (Math.random() < 0.5)
  {
    System.out.println("H");
  }
  else
  {
    System.out.println("T");
  }
if(Math.random()<0.5)
{
系统输出打印项次(“H”);
}
其他的
{
系统输出打印项次(“T”);
}
使用原始代码时,头一次出现的几率为50/50,在这种情况下,您可以打印
“H”
。如果您没有抛出一个
“H”
(即其他50%的时间),您现在只有50/50的机会打印一个
“t”
,因此您只有25%的时间看到
“t”


因此,平均来看,您将看到7.5个结果,其中5个是
“H”
,2.5个是
“T”
。哦,除了循环11次之外,循环次数太多了,以至于1.1倍,问题是因为每次存储结果时都在重新计算随机变量

您的代码已注释:

if (Math.random() < 0.5) { // if the random value is less than 0.5
    System.out.println("H");
} else if (Math.random() > 0.5) { //otherwise, it the new random value is greater than 0.5
    System.out.println("T");
}
if(Math.random()<0.5){//如果随机值小于0.5
系统输出打印项次(“H”);
}否则,如果(Math.random()>0.5){//否则,则新的随机值大于0.5
系统输出打印项次(“T”);
}
这可以通过以下方法进行纠正:

double random = Math.random();
if (random < 0.5) {
    System.out.println("H");
} else { // if it is not "< 0.5", then surely it is "> 0.5" (can't be equal to 0.5)
    System.out.println("T");
}
double random=Math.random();
if(随机<0.5){
系统输出打印项次(“H”);
}否则{//如果它不是“<0.5”,那么肯定是“>0.5”(不能等于0.5)
系统输出打印项次(“T”);
}
请注意,您将循环11次,而不是10次,因为有11个数字介于0和10之间(含10)


旁注2:最好不要在这里使用
Math.random()
,而是使用
random.nextBoolean()
,它直接给出一个随机布尔值。

问题来自这样一个事实,即每次应该存储结果时,您都在重新计算随机变量

您的代码已注释:

if (Math.random() < 0.5) { // if the random value is less than 0.5
    System.out.println("H");
} else if (Math.random() > 0.5) { //otherwise, it the new random value is greater than 0.5
    System.out.println("T");
}
if(Math.random()<0.5){//如果随机值小于0.5
系统输出打印项次(“H”);
}否则,如果(Math.random()>0.5){//否则,则新的随机值大于0.5
系统输出打印项次(“T”);
}
这可以通过以下方法进行纠正:

double random = Math.random();
if (random < 0.5) {
    System.out.println("H");
} else { // if it is not "< 0.5", then surely it is "> 0.5" (can't be equal to 0.5)
    System.out.println("T");
}
double random=Math.random();
if(随机<0.5){
系统输出打印项次(“H”);
}否则{//如果它不是“<0.5”,那么肯定是“>0.5”(不能等于0.5)
系统输出打印项次(“T”);
}
请注意,您将循环11次,而不是10次,因为有11个数字介于0和10之间(含10)


旁注2:这里最好不要使用
Math.random()
,而是使用
random.nextBoolean()
,它直接给出一个随机布尔值。

作为
循环的
第一行,就在第一个
if
的上方,放:

System.out.println("This is iteration #" + i);

因此,您可以真正看到“运动中的代码”,并且您可以区分循环实际迭代的次数与循环体的不可预测性质,其中输出以伪随机输入为条件。

作为
for
循环的
第一行,就在第一个
if
上方,输入:

System.out.println("This is iteration #" + i);

因此,您可以真正看到“运动中的代码”,并且可以区分循环实际迭代的次数和循环体不可预测的性质,其中输出以伪随机输入为条件。

当第一个Math.random()返回时会发生什么。6,第二个回来了。4?@UkuLoskit我完全错过了那一点!那一定是我的结果丢失的地方?当Math.random()返回0.5?@shaffy no时,真正的问题是,如果你没有得到一个头部,你就会再次抛出硬币,而不是仅仅说“如果它不是头部,那么它一定是尾巴”。第二个
Math.random()
返回与第一个不同的结果。当第一个Math.random()返回.6,而第二个返回.4时会发生什么?UkuLoskit我完全错过了这一点!那一定是我的结果丢失的地方?当Math.random()返回0.5?@shaffy no时,真正的问题是,如果你没有得到一个头部,你就会再次抛出硬币,而不是仅仅说“如果它不是头部,那么它一定是尾巴”。第二个
Math.random()!因此,没有显示的结果(即,当我只得到7)将是我假设的Math.random()=0.5的结果?实际上,不,精确到0.5是非常罕见的。当第一个结果>=0.5,然后在同一个循环迭代中得到第二个结果