Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++]Losowanie liczb rzeczywistych

Ostatnio zmodyfikowano 2014-12-21 15:12
Autor Wiadomość
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.
P-123178
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.
P-123179
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.
P-123181
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:

C/C++
( double )( rand() /( RAND_MAX ) ) *( 2 *( RAND_MAX ) ) +( - RAND_MAX ) //rzutowanie na double postawilbym w innym miejscu
P-123182
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
P-123183
« 1 »
  Strona 1 z 1