Totolotek

0

Witam, mam taki kod, który przeprowadza 5mln losowań liczb od 1 do 49, potem zlicza ile razy wypadła dana liczba. Chciałbym znaleźć 6 liczb, które wypadały najczęściej. Można to zrobić za pomocą warunków ale to chyba będzie zbyt skomplikowane i długie. Czy istnieje jakiś inny sposób? Proszę o podpowiedź.

package cwiczenia;

import java.security.SecureRandom;


public class Cwiczenia77 {
    
    public static void main(String[] args) {
        
        SecureRandom los = new SecureRandom();
        int [] czestosc = new int [50];
        
        for (int losowanie = 1; losowanie <= 5000000; losowanie++) {
            ++czestosc [1 + los.nextInt(49)];
        }
        System.out.printf("%s%15s%n", "Liczba", "Ilość razy");
        
        for (int licznik = 1; licznik <= 49; licznik++) {
            System.out.printf("%6d%15d%n", licznik, czestosc[licznik]);
        }
    }
    
}
1

Jeśli chcesz same liczby to możesz zrobić np:

		IntStream.range(0, czestosc.length)
			.boxed()
			.sorted(Comparator.<Integer, Integer>comparing(Function.identity(), Comparator.comparingInt(i -> czestosc[i])).reversed())
			.limit(6)
			.forEach(System.out::println);

Jeśli chesz liczby wraz z liczbą wystąpień, to np.:

		IntStream.range(0, czestosc.length)
				.mapToObj(i -> new int[]{i, czestosc[i]})
				.sorted(Comparator.<int[]>comparingInt(it -> it[1]).reversed())
				.limit(6)
				.forEach(it -> System.out.println("Liczba " + it[0] + " wystąpiła " + it[1] + " razy"));

Edit: Dla porównania w Kotlinie :) :

    czestosc.withIndex().asSequence()
        .sortedByDescending { it.value }
        .take(6)
        .map { it.index }
        .forEach(::println)

    czestosc.withIndex().asSequence()
        .sortedByDescending { it.value }
        .take(6)
        .forEach { println("Liczba " + it.index + " wystąpiła " + it.value + " razy") }

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