• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Generowanie liczb pseudolosowych - wasza opinia

0 głosów
142 wizyt
pytanie zadane 15 czerwca 2020 w C i C++ przez VBService VIP (144,010 p.)
zamknięte 30 czerwca 2020 przez VBService

Oto kilka propozycji (sposobów) generowania liczb pseudolosowych ("wygrzebane" ostatnio w sieci):

  1. r = min+(max-min)*rand()/double(RAND_MAX);

  2. r = min+((double)max-min)*rand()/RAND_MAX;

  3. r = min+rand()%(max-min+1);

  4. mt19937 mt(random_device{}());
    uniform_int_distribution<int> dist(min, max);
    r = dist(mt);

  5. r = rand()%max + min;

  6. 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. smiley

 

 

[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);
}

 

komentarz zamknięcia: Temat na dzień dzisiejszy 06.2020 wyczerpany
1
komentarz 16 czerwca 2020 przez Oscar Pasjonat (22,170 p.)
Te warianty z modulo mogą działać źle - tzn w wyniku dostaniesz rozkład niejednorodny. Dla przykładu - jeśli RAND_MAX byłoby 5 to z rand() % 3 dostaniesz

0 => 0, 1 => 1, 2 => 2, 3=> 0, 4=> 1 - jeśli wynik rand() jest rozłożony jednorodnie w przedziale [0, 4) to wynik 0 dostajesz w 2 przypadkach, 1 też w dwóch, a pozostałe w 1 przypadku a więc dwa razy rzadziej.

1 odpowiedź

+2 głosów
odpowiedź 15 czerwca 2020 przez dawid2002 Mądrala (5,140 p.)
wybrane 25 czerwca 2020 przez VBService
1
komentarz 16 czerwca 2020 przez draghan VIP (105,900 p.)
Widząc wątek chciałem podlinkować "rand() Considered Harmful", ale widzę że krzaq już to zrobił na swojej stronie. Polecam tamten materiał!

Podobne pytania

+1 głos
8 odpowiedzi 670 wizyt
0 głosów
1 odpowiedź 210 wizyt
pytanie zadane 2 czerwca 2021 w Offtop przez cava96 Gaduła (3,260 p.)
+2 głosów
1 odpowiedź 1,045 wizyt
pytanie zadane 18 lipca 2020 w Rozwój zawodowy, nauka, szkoła, praca przez Restej Dyskutant (8,530 p.)

86,448 zapytań

135,207 odpowiedzi

300,348 komentarzy

57,196 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...