[#1026] Is this a bug? — Dave Thomas <Dave@...>

18 messages 2000/01/03

[#1084] Infinite loop — Dave Thomas <Dave@...>

17 messages 2000/01/11

[#1104] The value of while... — Dave Thomas <Dave@...>

24 messages 2000/01/11

[ruby-talk:01055] Re: rand() / drand48()

From: matz@... (Yukihiro Matsumoto)
Date: 2000-01-05 15:52:46 UTC
List: ruby-talk #1055
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)) {

In This Thread