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.
prova.rar
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.