Totolotek, tablice i listy

0

Cześć, potrzebuję waszej pomocy. Nie potrafię i nigdzie nie znalazłem jak zrobić kilka tablic z wylosowanymi liczbami. Coś na zasadzie, że tablica generuje nowe liczby dopóki nie pokrywają się z tymi użytkownika. np. lotto tablice losuję liczby dopóki nie wylosuje takich liczb jak te użytkownika. Próbowałem różnych metod np. z do while. Na pojedynczej liczbie potrafię zrobić, żeby losowała tak długo, aż trafi tą użytkownika, ale z tablicami mam problem.

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

public class test {

    public static void main(String[] args) {
        boolean found = false;

        List<Integer> guessedNumbers = new ArrayList<>();
        System.out.println("Wprowadź liczby od 1 do 49");

        Scanner scan = new Scanner(System.in);
        for (int i = 0; i < 6; i++) {
            System.out.println("Twoje numery to " + guessedNumbers);
            System.out.println("Proszę wprowadź numer 1-49");
            while (true) {
                try {
                    String numberString = scan.nextLine();
                    int number = Integer.parseInt(numberString);
                    if (number >= 1 & number <= 49) {
                        guessedNumbers.add(number);
                        break;
                    } else
                        System.out.println(number + " liczba nie jest pomiędzy 1 a 49. Proszę wprowadź liczbę ponownie");
                } catch (NumberFormatException nfe) {
                    System.out.println("To nie jest liczba.");
                }
            }
        }

        List<Integer> winningNumbers = new ArrayList<>();
        int m = 0;
        Random random = new Random();


        for (int i = 0; i < 6; i++) {

            while (true) {
                int winningnumber = random.nextInt(49) + 1;
                if (!winningNumbers.contains(winningnumber)) {
                    winningNumbers.add(winningnumber);
                    break;
                }
            }
        }
        System.out.println(winningNumbers);
        System.out.println(guessedNumbers);
    }
}
1

Nie potrafię i nigdzie nie znalazłem jak zrobić kilka tablic z wylosowanymi liczbami.

Zacznijmy od tego, że liczby przechowujesz w liście a nie w tablicach.

Coś na zasadzie, że tablica generuje nowe liczby dopóki nie pokrywają się z tymi użytkownika. np. lotto tablice losuję liczby dopóki nie wylosuje takich liczb jak te użytkownika.

Tworzysz sobie metodę, która generuje 6 pseudolosowych liczb i zwraca tablice.

Tworzysz sobie kolejna metodę, która jako argumenty dostaje dwie tablice z liczbami: te od użytkownika oraz te wylosowane.
Metoda ta zwraca true lub false w przypadku kiedy tablice nie zawierają tych samych liczb.

Na koniec tworzysz trzecia metodę, która w pętli (dopóki poprzednia metodą nie jest true) sprawdza, czy liczby z jednej tablicy zawierają się w drugiej.
Jeżeli nie to na koniec losujesz nowa tablicę i sprawdzasz. Tak do momentu aż otrzymasz true.

Btw, Te liczby najlepiej by było trzymać w HashSet.

0

mam pewien problem, bo nie widzę w Twoim kodzie ani jednej tablicy... widzę ArrayList, ale to nie jest tablica tylko lista

0

Tak, przepraszam próbowałem z listami i tablicami, dlatego napisałem, a ten kod jest oczywiście z listami.

0

@.andy: Super! dziekuję

1

Można bez losowania, które wymusza obsłużenie sytuacji powtórzenia wartości:

// generowanie
List<Integer> collect = IntStream.rangeClosed(1, 49)
		.mapToObj(Integer::valueOf)
		.collect(Collectors.toList());
//losowanie
Collections.shuffle(
		collect
);
int[] __6z49 = collect.stream()
		.limit(6)
		.sorted()
		.mapToInt(Integer::intValue)
		.toArray();

// porównanie
Arrays.compare(__6z49, uzytkownikaPosortowane);

Liczby użytkownika muszą być posortowane, ale to jest dość tanie i proste.

1

Można bez losowania, które wymusza obsłużenie sytuacji powtórzenia wartości:

To żaden problem ;)

    static int[] generateRandomNumbers() {
        return IntStream.generate(() -> RandomUtils.nextInt(1, 49))
                .distinct()
                .limit(6)
                .sorted()
                .toArray();
    }
1

Zamiast listy czy tablicy możesz użyć zbioru (set). Tam elementy Ci się nie powtarzają.

2
PaulGilbert napisał(a):

Zamiast listy czy tablicy możesz użyć zbioru (set). Tam elementy Ci się nie powtarzają.

Tylko po wrzuceniu musisz sprawdzać ile jest tam elementów, czyli coś na zasadzie:

        Set<Integer> numbers = new HashSet<>();
        while(numbers.size() < 7) {
            numbers.add(RandomUtils.nextInt(1, 49));
        }

Lepiej wygenerować strumień losowych liczb bez powtórzeń z zakresu 1-49 i wybrać pierwsze 6 ;)

1
.andy napisał(a):
PaulGilbert napisał(a):

Zamiast listy czy tablicy możesz użyć zbioru (set). Tam elementy Ci się nie powtarzają.

Tylko po wrzuceniu musisz sprawdzać ile jest tam elementów, czyli coś na zasadzie:

        Set<Integer> numbers = new HashSet<>();
        while(numbers.size() < 7) {
            numbers.add(RandomUtils.nextInt(1, 49));
        }

Lepiej wygenerować strumień losowych liczb bez powtórzeń z zakresu 1-49 i wybrać pierwsze 6 ;)

Niby dobre, ale jakbyś zrobil nextInt(1, 6) to byś wpadł w nieskończoną pętle.

1 użytkowników online, w tym zalogowanych: 0, gości: 1