Prawdopodobieństwo 1/2

0

Czy jest jakiś krótki sposób w języku C na wylosowanie tablicy wartości z jednakowym prawdopodobieństwem? Tzn np. mogę wylosować tylko zero i jeden i chcę to zrobić z prawdopodobieństwem 0.5 każde. Całe zadanie brzmi tak:

" Skonstruuj strukturę liczba, która ma dwa pola: zmienną znakową oraz unię. Unia 
ma dwa pola: zmienną całkowita oraz rzeczywistą podwójnej precyzji. Zmienna 
znakowa przyjmuje jedną z dwóch wartosci 'i' lub 'd' oznaczającą typ zmiennej 
przechowywanej w unii. Zaalokuj tablicę 20 struktur typu liczba, z 
prawdopodobieństwem 1/2 wypełnij ją liczbami całkowitymi i rzeczywistymi. Napisz 
funkcję, która wypisze element tablicy (wartość i typ). Wypisz tablicę na ekran i do 
pliku binarnego. "

1

x=rand()&1; // z prawdopodobieństwem 0.5 będzie 0 i z takim samym prawdopodobieństwem będzie 1.

1

Albo:
x=rand() % 2;

0

Bullshit ;-) .... no ok, w tym szczególnym przypadku będzie to mniej wiecej prawda bo dzielimy przestrzeń RAND_MAX na dwie części jednak w wielu innych przypadkach musimy mieć na uwadze to :

"Notice though that this modulo operation does not generate a truly uniformly distributed random number in the span (since in most cases lower numbers are slightly more likely), but it is generally a good approximation for short spans."
http://www.cplusplus.com/reference/clibrary/cstdlib/rand/

oraz

"rand() implements a linear congruential random number generator which has a cycle of 232 and generates every integer [0...232-1] exactly once during the cycle before repeating.

LCRNG is defined as a function : f(x) = ( f(x-1) * C1 + C2 ) mod P

where C1 and C2 are carefully chosen constants and P = 2^32.
Here x and x-1 are taken to be indices, ie, the xth random number is generated by using the x-1th random number as the seed."

Czyli lepiej użyć czegoś takiego:

(((double) rand() / (RAND_MAX+1)) * (max-min+1) + min)

Trzeba się tylko upewnić że RAND_MAX+1 nie przepełni się.

czyli dla przykładu masz :
(((double)rand()/(RAND_MAX+1)) * (1-0+1) + 0) = ((double)rand()/(RAND_MAX+1)) * 2

0

Na próbie 1000 liczb najlepiej wypada sposób cyriela- najprostsze rozwiązania widocznie są najlepsze. :) Dziękuję za pomoc.

1

załóżmy, że rand() jest idealnie jednostajne, licząc rand() % n, mamy szansę na rozkład jednostajny tylko wtedy gdy RAND_MAX + 1 dzieli się bez reszty przez n

1 użytkowników online, w tym zalogowanych: 0, gości: 1