for循环每次都不会迭代到所需的数字

时间:2015-10-11 21:38:00

标签: 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)
      {
        System.out.println("H");
      }
      else if (Math.random() > 0.5)
      {
        System.out.println("T");
      }
    }
  }
}

3 个答案:

答案 0 :(得分:4)

问题来自于每次应该存储结果时都要重新计算随机变量。

您的代码已评论:

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");
}

可以通过以下方式纠正:

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");
}

旁注,你将循环11次,而不是10次,因为有0到10之间的11个数字。

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

答案 1 :(得分:1)

你不需要第二个if - 此刻,如果你不打印"H",你会在每次迭代中抛出第二枚硬币,如果第二枚硬币是尾巴,则仅打印"T"

应该只是:

  if (Math.random() < 0.5)
  {
    System.out.println("H");
  }
  else
  {
    System.out.println("T");
  }

使用原始代码,首次出现的可能性为50/50,在这种情况下,您需要打印"H"。如果您没有投掷"H"(即其他50%的时间),您现在只有50/50的机会打印"T",因此,您只会在25%的时间内看到"T"

因此,平均而言,您将看到7.5个结果,其中5个将是"H",其中2.5个将是"T"。哦,除了你做了11次循环,所以多了1.1次

答案 2 :(得分:0)

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

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

所以你真的看到&#34;代码在运动&#34;,你可以区分循环实际迭代的次数,而不是循环体的不可预测的性质,其中输出是以伪 - 为条件的随机输入。