Für das Problem gibt's auch in den C-FAQs einen portablen Standard
Random Number Generator:
// portable random number generator of Park and Miller; best C-FAQs
version
# define PMRAND_MIN 1 // Min. output
# define PMRAND_MAX 2147483647 // Max. output
# define a 48271
# define m 2147483647
# define q (m / a)
# define r (m % a)
static long int seed = 1;
// initialisation, e. g. PMrand_seed((long int)time(NULL))
void
PMrand_seed (long int j)
{
seed = j;
return;
}
// seed==0-tolerant version
signed long int
PMrand ()
{
signed long int hi = seed / q;
signed long int lo = seed % q;
signed long int test = a lo - r hi;
if (test > 0)
seed = test;
else
seed = test + m;
return seed;
}
# undef a
# undef m
# undef q
# undef r
Die Qualität dieser Zufallszahlen ist gut; beispielsweise ist die
Ausgabe modulo 2 NICHT gleich 0, 1, 0, 1 ....
Zum Initialisieren wird meist time genommen, also:
PMrand_seed((long int)time(NULL));
Falls man time nicht zur Verfügung hat, dann muß man die Systemzeit in
Sekunden nehmen; jedenfalls etwas, was sich ständig ändert und
praktisch nicht (exakt) vorhersagbar ist.
Weil time nur als seed dient, also nicht direkt im Zufallswert steckt,
ist diese Lösung einfach und zuverlässig.
Wenn's um reinen echten Zufall geht, wird's normalerweise zu
aufwendig (www.true-random.com).