• 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

Object Storage Arubacloud
0 głosów
277 wizyt
pytanie zadane 15 czerwca 2020 w C i C++ przez VBService Ekspert (253,340 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 Nałogowiec (29,290 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,190 p.)
wybrane 25 czerwca 2020 przez VBService
1
komentarz 16 czerwca 2020 przez draghan VIP (106,230 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 1,070 wizyt
0 głosów
1 odpowiedź 1,118 wizyt
pytanie zadane 2 czerwca 2021 w Offtop przez cava96 Gaduła (3,940 p.)
+2 głosów
1 odpowiedź 3,204 wizyt
pytanie zadane 18 lipca 2020 w Rozwój zawodowy, nauka, praca przez Restej Dyskutant (8,690 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...