Cześć.
W klasie, którą tworzę chcę używać liczb losowych. Mam jednak dylemat, gdzie wywołać funkcję srand -> czy w jednej z funkcji w klasie, czy może w funkcji main tj. poza klasą? A może jeszcze gdzie indziej?
Drugie pytanie dot. RAND_MAX -> u mnie ta liczba wynosi jakieś 32000 -> czy jest jakaś alternatywa, która zwraca liczbę losową od 0 do przynajmniej 1 miliona? -> w programie będę potrzebował sporo razy losować taką liczbę i wydaje mi się, że liczenie sumy x losowań standardową funkcją to kiepski pomysł...
pozdrawiam
Możesz wykorzystać nowy standard C++. To powinno działać zarówno w GCC jak i VS.
int min = 0;
int max = 1e6;
// Generator liczb.
std::mt19937 engine(std::time(nullptr));
// Żądany rozkład.
std::uniform_int_distribution<> dist(min, max);
// Żeby było prościej.
auto gen = std::bind(dist, engine);
// Np. losowa liczba:
int random_number = gen();
Wersja bez rozwlekania:
// Generator liczb losowych.
auto gen = std::bind(std::uniform_int_distribution<>(min, max),
std::mt19937(std::time(nullptr)));
Inicjowanie generatora liczb czasem to nie jest najlepszy pomysł. Lepiej użyć do tego std::random_device
.
http://4programmers.net/Forum/C_i_C++/205669-liczba_losowa_-_double?p=889401#id889401
Drugie pytanie dot. RAND_MAX -> u mnie ta liczba wynosi jakieś 32000 -> czy jest jakaś alternatywa, która zwraca liczbę losową od 0 do przynajmniej 1 miliona?
losuj dwie liczby, a wynik to pierwsza liczba << 16 plus druga.
Dzięki wielkie Panowie :)
Azarien napisał(a):
Drugie pytanie dot. RAND_MAX -> u mnie ta liczba wynosi jakieś 32000 -> czy jest jakaś alternatywa, która zwraca liczbę losową od 0 do przynajmniej 1 miliona?
losuj dwie liczby, a wynik to pierwsza liczba << 16 plus druga.
Niestety coś jest nie tak -> losuje z dużo większego przedziału niż (0,1mln) - w dodatku również liczby ujemne.
Dla pewności kod poniżej:
srand((unsigned int)time(nullptr));
long int x,y, liczba_losowa; //próbowałem również z long long i samym int oraz unsigned
for(i=0; i<100; i++)
{
x = rand();
y = rand();
liczba_losowa = x << 16 + y;
cout << "liczba_loswa = " << liczba_losowa << endl;
}
Wywala mi również ostrzeżenie: warning C4554: '<<' : check operator precedence for possible error; use parentheses to clarify precedence
Temat mnie trochę wciągnął więc mam kilka dodatkowych pytań.
- co oznacza funkcja entropy() w klasie random_device? I co jeśli u mnie zwraca wartość 32? W znalezionym artykule doczytałem, że: "jeśli funkcja entropy() zwróci wartość 0, to oznacza to, że do generacji liczb pseudolosowych został wygenerowany generator programowy" -> niestety nie za bardzo to rozumiem :( No i nie jest napisane co gdy funkcja zwraca wartość != 0...
- czym różni się klasa random_device od generatora liczb pseudolosowych? Bo jak zdefiniujemy sobie obiekty random_device to będziemy mieli dostęp do jakiejś liczby pseudolosowej -> więc po co stosuje się jeszcze mt19937? I czym różni się mt19937 od szablonu mersenne_twister_engine?
- co oznacza/co robi taki zapis: std::ref(random_device) -> nie mogę wygooglować :(
- doczytałem, że jest kilka szablonów do tworzenia liczb pseudolosowych w tym: linear_congruential_engine, która jest najsłabsza a pod względem szybkości jest średnia natomiast najlepsza jest mersenne_twister_engine a jej szybkość jest duża -> jak to możliwe, że to co lepsze jest również szybsze?
Dziękuję za odpowiedzi i pozdrawiam!