In message "[ruby-talk:01053] rand() / drand48()"
on 00/01/05, ts <decoux / moulon.inra.fr> writes:
| If I read it correctly a call to srand48() must be made before any call
| to drand48().
|
| Apparently in random.c, ruby never check if the initialization function
| was called. Can this be a problem for the random generator ?
Oops, I haven't noticed that. You're right. Here's the patch.
--- /tmp/random.c Thu Jan 6 00:46:39 2000
+++ random.c Thu Jan 6 00:50:51 2000
@@ -83,2 +83,26 @@
+static int
+rand_init(seed)
+ long seed;
+{
+ int old;
+ static unsigned int saved_seed;
+
+#ifdef HAVE_RANDOM
+ if (first == 1) {
+ initstate(1, state, sizeof state);
+ first = 0;
+ }
+ else {
+ setstate(state);
+ }
+#endif
+
+ SRANDOM(seed);
+ old = saved_seed;
+ saved_seed = seed;
+
+ return old;
+}
+
static VALUE
@@ -91,3 +115,2 @@
unsigned int seed, old;
- static unsigned int saved_seed;
@@ -103,16 +126,3 @@
}
-
-#ifdef HAVE_RANDOM
- if (first == 1) {
- initstate(1, state, sizeof state);
- first = 0;
- }
- else {
- setstate(state);
- }
-#endif
-
- SRANDOM(seed);
- old = saved_seed;
- saved_seed = seed;
+ old = rand_init(seed);
@@ -127,2 +137,10 @@
+ static initialized = 0;
+
+ if (first) {
+ struct timeval tv;
+
+ gettimeofday(&tv, 0);
+ rand_init(tv.tv_sec ^ tv.tv_usec ^ getpid());
+ }
switch (TYPE(vmax)) {