Oto kilka propozycji (sposobów) generowania liczb pseudolosowych ("wygrzebane" ostatnio w sieci):
-
r = min+(max-min)*rand()/double(RAND_MAX);
-
r = min+((double)max-min)*rand()/RAND_MAX;
-
r = min+rand()%(max-min+1);
-
mt19937 mt(random_device{}());
uniform_int_distribution<int> dist(min, max);
r = dist(mt);
-
r = rand()%max + min;
-
r = (rand()%ile_liczb_w_przedziale)+startowa_liczba;
Który ze sposobów: Jest dobry i dlaczego? Jest do "bani" i dlaczego?
Masz lepszy? Przedstaw go i napisz (uzasadni krótko) dlaczego lepszy?
Pozdrawiam i z góry dziękuję za wszelkie komentarze.
[UPDATE]
Ten wykład daje dużo do przemyślenia i nie zostawia "suchej" nitki na poleceniu rand() i srand():
rand() Considered Harmful [ YT ] [ CH9 ] (podziękowania dla: dawid2002 , draghan)
Czyli propozycja czwarta na liście, może kwalifikować się do miana tej "najlepszej"
PrintSrc - pochodzi z artykułu umieszczonego na stronie: Nie używaj rand(), C++ ma <random>
/*
Autor: © 2020 Pierun
url: https://dsp.krzaq.cc/post/180/nie-uzywaj-rand-cxx-ma-random/
*/
thread_local std::mt19937 gen{std::random_device{}()};
template<typename T>
T random(T min, T max) {
using dist = std::conditional_t<
std::is_integral<T>::value,
std::uniform_int_distribution<T>,
std::uniform_real_distribution<T>
>;
return dist{min, max}(gen);
}