PDA

Visualizza la versione completa : [c] funzione che estragga 1/0 con distribuzione uniforme


hfish
18-02-2010, 10:00
mi servirebbe una funzione che con distribuzione uniforme estragga 1 o 0

per ora ho fatto una semplice rand() % 2 per vedere se il numero estratto è pari o dispari, e torno 1 o 0 a seconda appunto che il numero sia pari o dispari

tuttavia la rand() non mi fornisce la garanzia che i numeri pari e dispari siano estratti uniformemente con probabilità P=1/2

qualche consiglio?

grazie mille

MItaly
18-02-2010, 10:34
La rand se non sbaglio garantisce una distribuzione uniforme dei dati nell'intervallo 0 - RAND_MAX; se l'uso dell'operatore modulo può sballare un po' la questione sugli intervalli ampi, comunque su intervalli piccoli (divisori di RAND_MAX) dovrebbe dare una distribuzione corretta - sull'intervallo 0-1, poi, dovrebbe essere praticamente perfetta. Ho fatto una prova al volo e in effetti la distribuzione, su 2^31 prove, sulla mia macchina è corretta.


#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

#define N 2
#define MAX ((unsigned long)(1<<31))

int main()
{
unsigned long val[N]={0};
srand(time(NULL));
for(unsigned long i=0; i<MAX; i++)
val[rand()%N]++;
for(int i=0;i<N;i++)
cout<<i<<": "<<val[0]<<endl;
return 0;
}

Output:


matteo@teolapubuntu:~/cpp$ g++ -O3 -Wall -Wextra randtest.cpp -o randtest.x
matteo@teolapubuntu:~/cpp$ ./randtest.x
0: 1073736438
1: 1073736438
Comunque esistono diverse librerie scientifiche (ad esempio la GNU Scientific Library) che forniscono i generatori di numeri casuali più vari, se ti servono garanzie "serie" ti consiglio di adoperarle.

hfish
18-02-2010, 11:11
gentile, preciso, corretto

che si può volere di più? :)

grazie mille

MItaly
18-02-2010, 12:12
Originariamente inviato da hfish
gentile, preciso, corretto

che si può volere di più? :)
Un Lucano? :)


grazie mille
:ciauz:

Loading