Generator liczb losowych

0

Cześć,

Napisałem generator liczb losowych z pomocą książki do Javy i mam problem ze zrozumieniem części kodu:

 public class Generator 
{

	public static void main(String[] args) 
	{
		Scanner skaner1 = new Scanner(System.in);
		System.out.println("Ile liczb będziesz losować?");
		int a = skaner1.nextInt();
		System.out.println("Jaka jest największa liczba?");
		int b = skaner1.nextInt();
		
		int[] talbica1 = new int[b];
		for(int i = 0; i < talbica1.length; i++)
		{
			talbica1[i] = i + 1;
		}
		
		int[] result = new int[a];
		for(int i = 0; i < result.length; i++)
		{
			int r = (int) (Math.random() * b);
			result[i] = talbica1[r];
			talbica1[r] = talbica1[b - 1];
			b--;
		}
		Arrays.sort(result);
		for(int x : result)
		{
			System.out.println(x);
		}
		System.out.println(Arrays.toString(result));

Chodzi mi o to, że jak losuję liczbę

 int r

i wyniesie ona np. max B czyli np. 5, to w linijce

 result[i] = talbica1[r];

przypisuję wartość z 5 miejsca tablicy "tablica1" do miejsca w tablicy "result[i]".
Ale "tablica1" ma długość 5 czyli 0, 1, 2, 3 i 4 więc jak ma przypisać wartość z piątego miejsca którego nie ma?

Może popełniam gdzieś błąd w rozumieniu funkcji random?

1

Nigdy nie uzyskasz w wyniku losowania liczby b.
Math.random() zwraca liczbę z przedziału <0;1),
Math.random()*b jest z przedziału <0;b),
rzutowanie (int)Math.random()*b obcina część całkowitą.

0

Rozumiem to co napisałeś, ale przyjmijmy taką sytuację, że użytkownik podaje "b" = 5. Co ustawia rozmiar tablicy "tablica1" na pięć elementów (rozumiem już, że od zera) i wypełnia je kolejno wartościami 1, 2, 3, 4 i 5. I załóżmy, że metoda random wypadnie na 1 - czyli 1 * 5 = 5.
I teraz nie rozumiem jak w linijce:

 result[i] = talbica1[r];

result[0] może przyjąć wartość piątego elementu tablicy "tablica1" skoro ma ona elementy 0, 1, 2, 3 i 4 (pięć elementów)?

1

Nie rozumiesz tego co napisałem. Przeczytaj zdanie
Math.random() zwraca liczbę z przedziału <0;1) jeszcze z pięć razy, może pomoże.
Skoro pytasz o największą liczbę, to powinieneś poprawić kod.

        System.out.println("Jaka jest największa liczba?");
        int b = skaner1.nextInt();
 
        int[] talbica1 = new int[b + 1];
        ...
        for(int i = 0; i < result.length; i++)
        {
            int r = (int) (Math.random() * (b + 1));
0

Nie prowadź dyskusji w komentarzach. Masz rację, niedokładnie obejrzałem kod. Co ten generator ma niby robić? Kod wygląda na całkowicie bezsensowny, a na dodatek instrukcje

            talbica1[r] = talbica1[b - 1];
            b--;

spowodują przekroczenie zakresu tablicy.

0

Ten kod jest zaczerpnięty z książki "Java podstawy" wydanie IX. Głównym założeniem jest posortowanie wygenerowanych losowo wartości. Moje pytanie wzięło się z tego, że chciałem zrozumieć całość a nie tylko samo sortowanie.
Część kodu którą wyszczególniłeś to zabezpieczenie, aby nie wylosować dwa razy tej samej liczby.

0

Co Ty opowiadasz?
Zabezpieczenie przed dwukrotnym wylosowaniem jest w generatorze liczb losowych bez sensu, na tym polega losowość, że rzucając kostką możesz wyrzucić trzy szóstki z rzędu. Poza tym, to niepotrzebne zabezpieczenie spowoduje błąd wykonania:
Niech a = 4, b = 2. Pętla

         for(int i = 0; i < result.length; i++)
        {
            int r = (int) (Math.random() * b);
            result[i] = talbica1[r];
            talbica1[r] = talbica1[b - 1];
            b--;
        }

wykona się cztery razy, po dwóch przebiegach b będzie równe zero, w trzecim przebiegu będzie odwołanie do indeksu równego -1.

0

Masz rację, że w podanym przez Ciebie przykładzie wykona się tylko dwa razy.
Jak napisałem wcześniej, program ma służyć do nauki sortowania, a sama logika została pewnie tylko do tego przykładu sprowadzona.

0

Całe sortowanie w Twoim kodzie to instrukcja

Arrays.sort(result);

Nie wiem czego tu się trzeba uczyć. Nawet nie sprawdzisz czy sortowanie się udało, bo Twój program rzuci wyjątkiem ArrayIndexOutOfBoundsException nim dojdzie do instrukcji sortującej.

0

Jak tylko podam, że chcę wylosować więcej liczb niż będę miał w tablicy, to masz rację - nie uda się. Ale mam to w głowie, żeby tak nie robić.
Taki jest przykład w książce, nie ja to wymyśliłem.

0

Od kiedy to Math.random() zwraca liczbę losową? o_O Z tego co się orientuje to pseudo-losowe a nie losowe bo znając poprzednie liczby jakie Math.random() wylosował możemy ustalić jaki był stan generatora na początku i tym samym dowiedzieć się jaka będzie liczba następna. Do generowanie liczb losowych w przeglądarkach używa się crypto.getRandomValues(buffer) :)

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