[C++]Losowanie liczb rzeczywistych
Ostatnio zmodyfikowano 2014-12-21 15:12
Ins790 Temat założony przez niniejszego użytkownika |
[C++]Losowanie liczb rzeczywistych » 2014-12-21 14:04:42 Staram się wylosować liczbę rzeczywista z przedziału (-RAND_MAX , RAND_MAX). Mam coś takiego :
((double)rand() / (RAND_MAX)) * (2*(RAND_MAX)) + (-RAND_MAX)
Mój problem polega na tym ze wylosowane liczby zawsze są całkowite. Nie rozumiem dlaczego. Zauważyłem również ze jeżeli podzielę rand() przez (RAND_MAX+1) to otrzymuje już liczby niecałkowite. Nic juz z tego nie rozumiem. Bardzo proszę o pomoc. |
|
GolemXIV |
» 2014-12-21 14:48:11 A jakie by miały wyjść? robisz de facto: rand() * RAND_MAX - RAND_MAX To Ci w życiu nie wyjdzie ułamkowe, nawet jak rand() skonwertujesz na double.
1. Twój wzór generuje liczby z przedziału RAND_MAX*RAND_MAX-RAND_MAX .. -RAND_MAX (inaczej niż opisałeś).
2. Może tak: możliwych liczb losowych jest RAND_MAX+1. Przedziału od RAND_MAX+1 do -RAND_MAX nie pokryjesz gęściej, niż co 2. Dokładnie co 2.
3. Jak dorzucisz voodo - na przykład generowanie najpierw części całkowitej, a potem ułamka (żeby były rzeczywiste) - będą ułamkowe, ale ich rozkład nie będzie równomierny.
|
|
Ins790 Temat założony przez niniejszego użytkownika |
» 2014-12-21 14:59:32 ((double)rand() / (RAND_MAX)) * (2*(RAND_MAX)) + (-RAND_MAX)
Pisząc to myślałem w taki sposób: -rand() losuje mi liczbe od 0 do rand max. -jezeli podziele to przez rand max otrzymam ułamek z przedzialu <0,1> -przy zalozeniu ze rand wylosowalo 0 otrzymuje minimalna liczbe -RAND_MAX -przy zalozeniu ze rand wylosuje 1 otrzymam RAND_MAX -kazda posrenia liczba wylosowana przez rand rożna od 0 i 1 po wykonaniu * (2*(RAND_MAX)) + (-RAND_MAX) powinna mi dac liczbę z mojego przedzialu
Dopiero sie uczę także bądz wyrozumialy. Prosze o jakies wmiare prosto wytlumaczenie błedów w moim toku myslenia. |
|
Tomek_z_W11 |
» 2014-12-21 15:05:12 A gdzie to całe losowanie liczb rzeczywistych przypisujesz? Może do int'a? Jeżeli tak, to zmień na double'a. I jeszcze jedno: ( double )( rand() /( RAND_MAX ) ) *( 2 *( RAND_MAX ) ) +( - RAND_MAX )
|
|
GolemXIV |
» 2014-12-21 15:12:40 Dwa wątki są: 1. Ułamki Weź dla przykładu prosty generator, który produkuje cztery wartości: 0,1,2,3. Wtedy RAND_MAX będzie 3 Jeśli pokryć zakres +/-RAND_MAX _równomiernie_ czterema wartościami to wyjdą one takie: to 3,1,-1,-3. Nie będzie ułamków. To ćwiczenie zawsze tak samo wyjedzie, niezależnie od tego ile różnych liczb losowych jest. Zawsze wyjdzie co 2, i nigdy ułamków nie ujrzysz. Jakbyś chciał zakres RAND_MAX/2..-RAND_MAX/2 to też Ci wyjdzie równo. Co 1. Trochę mylące jest konwencjonalne myślenie, że liczby double i float są rzeczywiste. One są zaledwie wymierne. 2. Zakres wystarczyłoby 2*rand()-RAND_MAX. Dla rand()==0 wyjdzie -RAND_MAX, dla rand()==RAND_MAX wyjedzie RAND_MAX. I jak widzisz - ten algorytm też nie daje szansy na wartości ułamkowe. aaaa: przy zalozeniu ze rand wylosuje 1 otrzymam RAND_MAX
|
rand zazwyczaj wylosuje sporo więcej niż 1 |
|
« 1 » |