Ciao a tutti, come da titolo ho dei problemi a generare dei numeri pseudo-casuali che siano equiprobabili.
Vi allego il codice:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <time.h>
#define DIM 50000
#define CICLO 1000000000
#define MEDIA CICLO/DIM
int Rand(int min,int max){
int num=min,i=(max-min)/RAND_MAX,agg=0;
while(i>0){
num+=rand();
i--;
agg+=RAND_MAX;
}
if(agg<(max-min))
num+=rand()%(max+1-min-agg);
return num;
}
int main()
{
srand(time(NULL));
int v[DIM]={0},i;
FILE *f=fopen("prova.txt","w");
for(i=0;i<CICLO;i++){
v[Rand(5,DIM-1)]++;
}
fprintf(f,"Media apparizione ogni numero: %d\n\n",MEDIA);
for(i=0;i<DIM;i++)
fprintf(f,"%5d. <%d>\n",i,v[i]);
return 0;
}
L'obiettivo è quello di costruire una funzione che genera un numero casuale (equiprobabile) su un range di valore maggiore di RAND_MAX.
L'idea che è stata usata è sommare rand() ad una variabile tante volte quante max/RAND_MAX.
Il problema è che cosi perdo l'equiprobabilità di ogni numero, per questo vi allego prova.txt(zippato) che contiene quante volte sono stati estratti ogni singolo numero.
Ho provate anche in un altro modo, cioè a dilatare il numero estratto da rand(), ma in questo modo non vengono estratti tutti i valori.
Se avete qualche idea ve ne sarei molto grato.