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.");
}
}
答
有两个问题在你的代码:
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));
}
记住,这可能会导致死循环。虽然这是不太可能的。至少这个循环确实有不同的执行时间。
请记住,一个'Set'会删除重复项,这意味着如果该值已经在'Set'中,'add'将被忽略。 – 4castle