Java抽奖模拟使用集合,不产生正确数量的随机结果或正确比较设置

问题描述:

我一直在编程一个彩票模拟,有一些帮助,我在这个网站上看到的问题。我似乎无法让程序显示我需要的正确数量的结果,而且这两套不能正确比较有多少数字匹配。Java抽奖模拟使用集合,不产生正确数量的随机结果或正确比较设置

import java.util.Set; 
import java.util.HashSet; 
import java.util.Random; 
import java.util.Scanner; 

public class Lotto { 
    private static final int INPUT_SIZE = 6; 

    private static final int MIN_NUMBER_POSSIBLE = 1; 
    private static final int MAX_NUMBER_POSSIBLE = 10; 

    private Set<Integer> userNumbers = new HashSet<Integer>(); 
    private Set<Integer> randomNumbers = new HashSet<Integer>(); 

    public static void main(String[] args) { 
     Lotto c = new Lotto(); 
     c.generateRandomNumbers(); 
     System.out.println("Please choose " + INPUT_SIZE + " numbers from " + MIN_NUMBER_POSSIBLE + " to " + MAX_NUMBER_POSSIBLE + ", hit enter after each number."); 
     c.readUserNumbers(); 

     if (c.doUserNumbersMatchRandomNumbers()) { 
      System.out.println("Congratulations, you have won!"); 
     } else { 
      System.out.println("Not a winner, better luck next time."); 
      c.showRandomNumbersToUser(); 
     } 
    } 

    private void generateRandomNumbers() { 
     Random random = new Random(); 
     for (int i = 0; i < INPUT_SIZE; i++) { 
      randomNumbers.add(random.nextInt(MAX_NUMBER_POSSIBLE)); 
     } 
    } 

    private void showRandomNumbersToUser() { 
     System.out.println("\nLotto numbers were : "); 
     for (Integer randomNumber : randomNumbers) { 
      System.out.println(randomNumber + "\t"); 
     } 
    } 

    private void readUserNumbers() { 
     Scanner input = new Scanner(System.in); 
     int inputSize = 1; 
     while (input.hasNextInt() && inputSize < INPUT_SIZE) { 
      int numberChosen = input.nextInt(); 
      if (numberChosen < MIN_NUMBER_POSSIBLE || numberChosen > MAX_NUMBER_POSSIBLE) { 
       System.out.println("Your number must be in " + MIN_NUMBER_POSSIBLE + " - " + MAX_NUMBER_POSSIBLE + " range."); 
      } else { 
       userNumbers.add(numberChosen); 
       inputSize++; 
      } 
     } 
    } 

    private boolean doUserNumbersMatchRandomNumbers() { 
     for (Integer userNumber : userNumbers) { 
      for (Integer randomNumber : randomNumbers) { 
       if (!randomNumbers.contains(userNumber)) { 
        return false; 
       } 
      } 
      printMatchingNumber(userNumber); 
     } 
     return true; 
    } 

    private void printMatchingNumber(int num) { 
     System.out.println("Your number, " + num + ", has been drawn."); 
    } 
} 
+0

请记住,一个'Set'会删除重复项,这意味着如果该值已经在'Set'中,'add'将被忽略。 – 4castle

有两个问题在你的代码:

1)generateRandomNumbers,你应该考虑到的是,相同的随机数可能发生多次。所以请确保randomNumbers的尺寸最终确实是INPUT_SIZE

2)在doUserNumbersMatchRandomNumbers中,您重复使用randomNumbers,但从不使用randomNumber

您存储的随机数的(Hash - )Set,如API描述Set一个特点是,它们不包含重复值(由他们与他们的equals()方法相比)。由于Random类可能会多次输出相同的值,因此您的Set中的值较少。

产生的随机数是去同一个while循环更好的方法:

while (random.size() < INPUT_SIZE) 
{ 
    randomNumbers.add(random.nextInt(MAX_NUMBER_POSSIBLE)); 
} 

记住,这可能会导致死循环。虽然这是不太可能的。至少这个循环确实有不同的执行时间。