Generator liczb losowych

2017-01-01 17:31
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?

Pozostało 580 znaków

2017-01-01 17:39
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ą.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 2x, ostatnio: bogdans, 2017-01-01 17:44

Pozostało 580 znaków

2017-01-01 18:04
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)?

edytowany 1x, ostatnio: furious programming, 2017-01-01 19:37

Pozostało 580 znaków

2017-01-01 18:13

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));

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans, 2017-01-01 18:17
Wyszły moje braki z matematyki... Wydaje mi się, że Twoja druga uwaga jest błędna, bo tablicę "tablica1" wypełniam już w miejscu zerowym wartością n + 1, więc wypełni mi ją np. b = 5 -> <1;5>? - rubesom 2017-01-01 18:39

Pozostało 580 znaków

2017-01-01 19:06
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.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2017-01-01 19:53
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.

Pozostało 580 znaków

2017-01-01 20:19
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.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2017-01-01 20:44
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.

Pozostało 580 znaków

2017-01-01 20:51
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.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2017-01-01 21:32
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.

Pozostało 580 znaków

2017-01-02 11:19
Brunatny Kot
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) :)

Gratuluję, popisałeś się wiedzą. A jakie znaczenie w tym zadaniu ma różnica między liczbą losową a pseudolosową? - bogdans 2017-01-02 11:39
Tak wiem, że to liczba liczona na podstawie daty 00:00 1 stycznia 1970. Dzięki za czujność. - rubesom 2017-01-02 16:57
kot, dobrze ze napisales to z anonima bo bylby wstyd i hanba. - vpiotr 2017-01-03 04:59

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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