Losowanie liczb pseudolosowych

0
Random losowanie = new Random()
System.out.println(losowanie.nextInt(20) 

Czemu w javie jest tak, że jak stworzyłem obiekt losowanie to potem jeszcze jest = new Random() ? W C++ tak nie trzeba by było, bo przecież później metoda jest wykonana na zmiennej losowanie.
I skąd nextInt Jest to metoda z klasy Random do losowania kolejnych liczb?

0

Czemu w javie jest tak, że jak stworzyłem obiekt losowanie to potem jeszcze jest = new Random() ?

Bo tak napisałeś, zupełnie niepotrzebnie. (Pokaż może kod, którym stworzyłeś obiekt losowanie).
Czytanie dokumentacji nie boli https://docs.oracle.com/javase/8/docs/api/java/util/Random.html.

0
Random losowanie;

to sama referencja do twojego generatora liczb losowych.

losowanie = new Random();

stworzenie obiektu klasy Random, podpięcie go pod referencję 'losowanie'.

dodanie znaczników <code class="java"> - @furious programming

1

Bo

Random losowanie;

w Javie bardziej odpowiada takiej konstrukcji w C++

Random* losowanie;

I tu i tu musisz korzystać z new, żeby tworzyć obiekt, bo deklarowałeś jedynie wskaźnik.

0

W C++ to po prostu

 a = rand() % 100

a w javie jest jakoś inaczej.

3

Algorytm generowania liczb pseudolosowych zawsze korzystają z jakiejś zmiennej (seed) do zapamiętania stanu i generowania następnej liczby.
W C (a nie w C++) zrobiono tak, że funkcja rand operuje na zmiennej globalnej (dla ciebie jest ona ukryta a jej wartość możesz zmieniać za pomocą srand.
To rozwiązanie ma wiele wad, ponieważ masz tylko jeden generator (tak naprawdę jeden generator zmiennych pseudolosowych na wątek). Generalnie chodzi o to, że niezależne fragmenty kodu mogą mieć wpływ na siebie na wzajem, jeśli używają rand.
Tymczasem jest wiele rozwiązań, w których wykorzystuje się przewidywalność generowania tych liczb.

Znając te problemy w Java i w innych językach, można stworzyć dowolną liczbę generatorów liczb losowych, w ten spsób zawsze masz swobodę, czy generator powinien być współdzielony przez różne algorytmy czy nie.
Z tego samego powodu do C++11 wprowadzono podobne rozwiązanie: http://www.cplusplus.com/reference/random/linear_congruential_engine/linear_congruential_engine/
http://www.cplusplus.com/reference/random/

0

ten kod

Random losowanie = new Random()

rozumieć tak:obiekt klasy Random,czyli wskaźnik losowanie pokazuje na adres obiektu,który jest generowany za pomocą funkcji Random() ?

Jeśli tak to jak np. w forze losuje kilka liczb to nie tworzą się tzw.śmiecie jak nie wyzeruje wskaźnika ? Bo adres pokazywanego wskaźnika się zmienia a liczby które zostały wylosowane wcześniej nie giną.

dodanie znacznika <code class="java"> - @furious programming

0

Kod

Random losowanie = new Random()

należy rozumieć tak: zbuduj maszynę losującą i nazwij ją losowanie.

0

Sam to chyba już zrozumiałem: Klasa random tworzy obiekt losowanie i do niego jest przypisana wartosc przez konstruktor Random() ?

0

Dobrze to teraz rozumiem ?

0

Nie, do obiektu Random nie jest przypisana wartość.

0

to czemu jest znak = ? Co on oznacza ?

0

To może wytłumacz co rozumiesz przez:

"Klasa random tworzy obiekt losowanie i do niego jest przypisana wartosc przez konstruktor Random()".

Bo nie wiem o jaką wartość ci chodzi.

0

Dobra powoli coś zaczynam rozumieć. Pisałem tylko w c++ dlatego w javie nie mogę tego zrozumieć. losowanie to zmienna referencyjna, czyli przezwisko obiektu który tworzy ?

0

Trochę tak, trochę nie.

losowanie to zmienna referencyjna, czyli przezwisko obiektu
prawda
losowanie to zmienna referencyjna, czyli przezwisko obiektu który tworzy
nieprawda - zmienna referencyjna niczego nie tworzy, tworzeniem zajmuje się konstruktor.

0

Myślę, że musisz trochę poczytać o OOP, bo sprawia Ci to jeszcze problem.
Może Ci pomoże: http://docs.oracle.com/javase/tutorial/java/concepts/index.html

0

czyli tak: losowanie to zmienna referencyjna, która pokazuje na obiekt stworzony przez konstruktor klasy Random.

0

Tak

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