/* beispiel4.c, 2000, rolf.freitag at email.de */ /* Ein Beispiel fuer das Erzeugen von exakt gleichverteilten */ /* Dezimalzahlen aus exakt gleichverteilten Binaerzahlen. */ #include int main (void) { unsigned int i1, i_lc=0; unsigned char c = 0; FILE *fp = NULL; fp = fopen ("/dev/urandom", "r"); // random is slower than urandom for (i1=1000; i1 > 999; i_lc++) // finisch when 0 <= i1 <= 999 { fscanf (fp, "%c", &c); /* wirklich zufaelliges Zufallsbyte einlesen */ i1 = ((unsigned int) c); /* Zufallsbyte in i1 zwischenspeichern */ fscanf (fp, "%c", &c); /* zweites Zufallsbyte einlesen */ i1 |= ((unsigned int) c) << 8; /* zweites Zufallsbyte in i1 zwischenspeichern */ i1 &= 0x3ff; /* nur die letzten 10 Bit verwenden: 0 <= i1 <= 1023 */ } /* Diese Schleife wird im Mittel 1,024 mal durchlaufen. */ fprintf (stdout, "Wirklich zufaellige Zufallszahl zwischen 1 und 1000, "); fprintf (stdout, "die mit einer\nWahrscheinlichkeit "); fprintf (stdout, "von exakt 0,001 einen der Werte 0...999 annimmt: %u\n", i1); fprintf (stdout, "%d Schleifen-Durchläufe wurden benötigt\n", i_lc); fclose (fp); return (0); }