ran1(&idum)

MX81

Grünschnabel
Hi. Ich möchte mit ran1(&idum) Zufallszahlen zwischen 0 und 1 erzeugen. Das Programm sieht folgendermaßen aus:

#define IA
Code:
16807
#define IM 2147483647
#define IQ 127773
#define IR 2836
#define NTAB 32
#define EPS (1.2E-07)
#define MAX(a,b) (a>b)?a:b
#define MIN(a,b) (a<b)?a:b

double ran1(idum)
int *idum;
{
        int j,k;
	static int iv[NTAB],iy=0;
	void nrerror();
        static double NDIV = 1.0/(1.0+(IM-1.0)/NTAB);
        static double RNMX = (1.0-EPS);
        static double AM = (1.0/IM);

	if ((*idum <= 0) || (iy == 0)) {
		*idum = MAX(-*idum,*idum);
                for(j=NTAB+7;j>=0;j--) {
			k = *idum/IQ;
			*idum = IA*(*idum-k*IQ)-IR*k;
			if(*idum < 0) *idum += IM;
			if(j < NTAB) iv[j] = *idum;
		}
		iy = iv[0];
	}
	k = *idum/IQ;
	*idum = IA*(*idum-k*IQ)-IR*k;
	if(*idum<0) *idum += IM;
	j = iy*NDIV;
	iy = iv[j];
	iv[j] = *idum;
	return MIN(AM*iy,RNMX);
}
#undef IA 
#undef IM 
#undef IQ
#undef IR
#undef NTAB
#undef EPS 
#undef MAX
#undef MIN

In der eigentlichen Funktion, wo es aufgerufen wird, initialisiere ich idum mit z.B. long idum=-3. Dann kann ich es aufrufen mit z.B. p_rand=ran1(&idum). Nun habe ich aber festgestellt, dass meine Zufallszahlen gar nicht zwischen 0 und 1 liegen sondern eher zwischen 0 und viel größeren Zahlen, ich kriege z.B. 12, 6, 0, 32 etc.
Hat jemand vielleicht eine Ahnung, woran das liegt?
vielen Dank für die Hilfe
 
Bitte die Code-Tags verwenden!
Und die defines habens dir wohl angetan, oder :-)

Nur so auf den ersten Blick: Du solltest die alte Parameternotation
möglichst nicht mehr verwenden.

Also statt
Code:
double ran1(idum)
int * idum

schreibst du
Code:
double ran1(int *idum)
 
Hi.
In der eigentlichen Funktion, wo es aufgerufen wird, initialisiere ich idum mit z.B. long idum=-3. Dann kann ich es aufrufen mit z.B. p_rand=ran1(&idum). Nun habe ich aber festgestellt, dass meine Zufallszahlen gar nicht zwischen 0 und 1 liegen sondern eher zwischen 0 und viel größeren Zahlen, ich kriege z.B. 12, 6, 0, 32 etc.
Das kann ich nicht nachvollziehen. Ich hab's gerade ausprobiert und mit einem Startwert von -3 für idum bekomme ich Werte zwischen 0 und 1. Etwas anderes ist eigentlich auch gar nicht möglich, da der Rückgabewert höchstens RNMX - also (1-eps) - beträgt.

Gruß
 
Zurück