liczba losowa w klasie - srand i RAND_MAX

0

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

0

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

http://ideone.com/Repsor

Wersja bez rozwlekania:

  // Generator liczb losowych.
  auto gen = std::bind(std::uniform_int_distribution<>(min, max),
                       std::mt19937(std::time(nullptr)));

http://ideone.com/ZSe9Ld

0

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

0

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.

0

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ń.

  1. 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...
  2. 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?
  3. co oznacza/co robi taki zapis: std::ref(random_device) -> nie mogę wygooglować :(
  4. 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!

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