2
public void pickWinner() {
      int last = list.size() - 1;
      int number = (int)Math.random()*last;
      System.out.println("And the winner is...");
      Student winner = list.get(number);
      System.out.println(winner);
}

ArrayList の最初の項目以外の勝者を生成する際に問題があります。ArrayList のサイズは正しいように見えるので、Math.random() に問題があると考えていますが、ArrayList の最初の項を取得するために 0 しか生成していないようです。この問題を解決するにはどうすればよいですか?

4

2 に答える 2

4

これを試して:

int number = (int)(Math.random()*last);

問題は、乗算する前に math.random 値を int にキャストしていることです。キャストは演算子の優先順位が高くなります (完全なリストについては、http://introcs.cs.princeton.edu/java/11precedence/を参照してください) 。

さらに、コードはリスト内の最後の Student を選択することはありません。「最後の」int を -1 するべきではありません。

Random クラスの使用を検討することもできnew java.util.Random().nextInt(list.size());ます。つまり、キャストや int の丸め方法について心配する必要がありません。複数回実行する必要がある場合は、Random インスタンスを再利用することもできます。

于 2013-10-05T13:43:39.600 に答える
1

Math.random()0.0との間の数を生成し1.0ます。最後に乗算する前に整数変換を行っているため、乱数は 0 まで下げられ、全体的な結果は常にゼロになります。

  int number = (int)(Math.random()*last);

正しく動作するはずです

于 2013-10-05T13:44:36.073 に答える