2017-02-10 26 views
0

Я программировал симуляцию лотереи, с некоторой помощью из вопросов, которые я рассматривал на этом сайте. Кажется, я не могу заставить программу отображать правильное количество результатов, которые мне требуются, и эти два набора не сравниваются правильно, чтобы сказать, сколько чисел совпало.Моделирование лотереи на основе 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' удаляет дубликаты, что означает, что' add' игнорируется, если значение уже находится в 'Set'. – 4castle

ответ

1

Там 2 проблемы в вашем коде:

1) В generateRandomNumbers вы должны принять во внимание, что то же самое случайное число может происходить несколько раз. Поэтому убедитесь, что randomNumbers действительно INPUT_SIZE размер в конце.

2) В doUserNumbersMatchRandomNumbers вы перебираете randomNumbers, но никогда не используете randomNumber.

0

Вы сохраняете случайные числа в (Hash -) Set, одна особенность Set, как описано в API является то, что они не содержат повторяющиеся значения (сравнивая их с их методом equals()). Поскольку класс Random может выводить одно и то же значение несколько раз, у вас меньше значений в Set.

Лучше подход для генерации случайных чисел будет идти с while цикла:

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

иметь в виду, что это может привести к бесконечной петле. Хотя это очень маловероятно. По крайней мере, этот цикл имеет разные времена выполнения.

 Смежные вопросы

  • Нет связанных вопросов^_^