2016-08-07 47 views
0

Ich wollte nach einer Normalverteilung eine Matrix mit Zufallszahlen bekommen, und ich schrieb diesen Code:Zufallszahlen mit C eine numerische Rezept

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <time.h> 

#define T 1 
#define dt 0.2 
#define iter (T/dt) 

#define TWOPI (6.2831853071795864769252867665590057683943387987502) 

/*See page 306 of 949 Numerical Recipes.*/ 
#define IM1 2147483563 
#define IM2 2147483399 
#define AM (1.0/IM1) 
#define IMM1 (IM1-1) 
#define IA1 40014 
#define IA2 40692 
#define IQ1 53668 
#define IQ2 52774 
#define IR1 12211 
#define IR2 3791 
#define NTAB 32 
#define NDIV (1+IMM1/NTAB) 
#define EPS 1.2e-7 
#define RNMX (1.0-EPS) 

float ran2(int *idum){ 
    int j; 
    long k; 
    static long idum2=123456789; 
    static long iy=0; 
    static long iv[NTAB]; 
    float temp; 

    if (*idum <= 0) { 
    if (-(*idum) < 1) *idum=1; 
    else *idum = -(*idum); 
    idum2=(*idum); 
    for (j=NTAB+7;j>=0;j--) { 
     k=(*idum)/IQ1; 
     *idum=IA1*(*idum-k*IQ1)-k*IR1; 
     if (*idum < 0) *idum += IM1; 
     if (j < NTAB) iv[j] = *idum; 
    } 
    iy=iv[0]; 
    } 
    k=(*idum)/IQ1; 
    *idum=IA1*(*idum-k*IQ1)-k*IR1; 
    if (*idum < 0) *idum += IM1; 
    k=idum2/IQ2; 
    idum2=IA2*(idum2-k*IQ2)-k*IR2; 
    if (idum2 < 0) idum2 += IM2; 
    j=iy/NDIV; 
    iy=iv[j]-idum2; 
    iv[j] = *idum; 
    if (iy < 1) iy += IMM1; 
    if ((temp=AM*iy) > RNMX) return RNMX; 
    else return temp; 
} 
/*End of the recipe.*/ 

double RANDN(int seed){ 
    return sqrt(-2.0*log(ran2(&seed)))*cos(TWOPI*ran2(&seed)); 
} 

double rnd(){ 
    return (double) rand()/(double) RAND_MAX; 
} 

int main(){ 
    int i,j,k; 
    double **x; 
    x=(double **)malloc(2*sizeof(double*)); 

    for(k=0; k<2; k++){ 
    x[k]=(double*)malloc(iter*sizeof(double)); 
    } 

    srand(time(NULL)); 
    for(i=0; i<2; i++){ 
    for(j=0; j<10; j++){ 
     x[i][j]=RANDN(rnd()+2); 
     printf("%lf\n",x[i][j]); 
    } 
    } 
    free(x); 
    return 0; 
} 

Um eine zufriedenstellende Zufallszahlen zu tun bekommen habe ich ein Rezept von das Buch Numerical Recipes, und um die Zufallszahlen nach einer Normalverteilung zu bekommen, schrieb ich die Funktion RANDN(). Der Seed dieser Funktion sollte jedes Mal anders sein, also setze ich als Seed nur die tipical random Funktion von C.

Das Problem ist, dass jedes Mal, wenn ich den Code ausführen, bekomme ich die gleichen Zahlen. Ich bekomme keine neue Liste von Zufallszahlen. Was könnte das Problem sein?

Antwort

4

Die Funktion dauert eine int, und Sie übergeben es eine double, mit der Funktion rnd. Die von dieser Funktion zurückgegebene double liegt im Bereich [0.0,1.0]. Dann wird 2 zu diesem Wert hinzugefügt und das Ergebnis wird auf int, immer abgeschnitten, wobei der Wert 2 an übergeben wird.

Da dieser Wert als Seed verwendet wird, ist der Seed immer gleich, auch wenn srand bei jeder Ausführung des Programms mit einem neuen Wert initialisiert wird.


Da die Formel die Palette für das Erhalten (double) rand()/(double) RAND_MAX; ist, die Funktion rnd könnte den Wert 1,0, zurück, die in 3 verläuft, nicht mehr als 2, um RANDN führen würde. Dies wird sehr selten passieren.