使用集合的Java彩票模拟,不生成正确数量的随机结果或正确比较集合

时间:2017-02-10 19:09:39

标签: java set hashset

我一直在为彩票模拟编程,在我网站上一直在寻找的问题上提供了一些帮助。我似乎无法让程序显示我需要的正确数量的结果,并且这两组没有正确比较以确定有多少数字匹配。

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

2 个答案:

答案 0 :(得分:1)

您的代码中存在2个问题:

1)在generateRandomNumbers中,您应该考虑到同一个随机数可能会多次出现。因此,请确保randomNumbers最终确实是INPUT_SIZE大小。

2)在doUserNumbersMatchRandomNumbers中,您对randomNumbers进行了迭代,但从不使用randomNumber

答案 1 :(得分:0)

您将随机数存储在(Hash - )Set中,Set中的equals()的一个功能是它们不包含重复值(通过将它们与Random方法进行比较)。由于Set类可能会多次输出相同的值,因此while中的值较少。

生成随机数的更好方法是使用while (random.size() < INPUT_SIZE) { randomNumbers.add(random.nextInt(MAX_NUMBER_POSSIBLE)); } 循环:

project.name = "foobar"
project.version = "1.0"

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