[C++] Losowanie liczby

Chciałbym wylosować liczbę w C++. Nie chodzi mi jednak o pseudolosową, jaką generuje rand(), a całkowicie losową. Jak uzyskać taką liczbę?

Dodaj przed rand() instrukcję:

srand(time(NULL));

Nie zapomnij też załączyć bibliotek:

i

Dodatkowo jeśli chcesz żeby Twoja liczba była z przedziału (0,x) to wystarczy użyć operatora modulo.

Standardowo C++ udostępnia tylko funkcję rand. W nadchodzącym standardzie C++ ma zostać dołączona do bibliotek standardowych bibloiteka do generacji liczb pseudolosowych. “Najbardziej” losowe są dane ze sprzętowych generatorów, ale kwestia ich obsługi jest już zależna od sprzętu, systemu, architektury itp.

Znaczy ja zawsze pisałem to tak:

int min=0;

int max=100;

int losowa=rand()%(max-min+1)+min;

Czyli teraz wystarczy, żebym zapisał:

int min=0;

int max=100;

srand(time(NULL))

int losowa=rand()%(max-min+1)+min;

Dobrze zrozumiałem?

Generowanie liczb całkowicie losowych za pomocą programu jest możliwe np dzięki http://pl.wikipedia.org/wiki/Mersenne_Twister

Pojecie całkowicie losowe jest też nie do końca trafne, ale stosując twister, możesz uzyskać naprawdę o wiele bardziej zróżnicowane wyniki niż rand().

Tak, instrukcję srand(time(NULL)) możesz umieścić w programie tylko raz (gdzieś na początku programu), nie ma sensu wstawiać jej przed każdym losowaniem.

Wielkie dzięki! Ta losowa jest już bardziej losowa, niż rand(), ponieważ rand() za każdym razem losowała liczby tak samo.

Rzuć kostką. Programowo można osiągnąć jedynie liczby pseudolosowe.

Hmm… No to się zdarza zawsze, gdy ktoś niepoprawnie używa tej funkcji.

Tak, wiem. Liczba losowa w programie nie istnieje. Jest to po prostu niemożliwe do wykonania. Ok, a jak poprawnie używać rand()? Bo szczerze mówiąc, to sam nie wiem, a jedynie skopiowałem to, co znalazłem w google.

Gdzieś w programie przeważnie jeden raz odpalasz srand();

dla różnicy (max-min) znacznie mniejszej niż RAND_MAX: min+rand()%(max-min+1);

dla pozostałych: min+(int)((max-min+1.0)*rand()/(RAND_MAX+1));

ot cała filozofia rand() :smiley:

Strumień pakietów sieciowych + bębnienie w klawiaturę wystarczy, żeby uzyskać bardzo dobre liczby losowe (nie pseudo-losowe).

cat /dev/random