[#1026] Is this a bug? — Dave Thomas <Dave@...>
18 messages
2000/01/03
[#1053] rand() / drand48() — ts <decoux@...>
11 messages
2000/01/05
[#1055] Re: rand() / drand48()
— matz@... (Yukihiro Matsumoto)
2000/01/05
[#1061] Re: rand() / drand48()
— gotoken@... (GOTO Kentaro)
2000/01/07
Hi,
[#1067] Here docs not skipping leading spaces — Dave Thomas <Dave@...>
5 messages
2000/01/08
[#1083] YADQ (Yet Another Dumb Question) — Dave Thomas <Dave@...>
12 messages
2000/01/10
[#1084] Infinite loop — Dave Thomas <Dave@...>
17 messages
2000/01/11
[#1104] The value of while... — Dave Thomas <Dave@...>
24 messages
2000/01/11
[#1114] Re: The value of while...
— Dave Thomas <Dave@...>
2000/01/12
matz@netlab.co.jp (Yukihiro Matsumoto) writes:
[#1128] Re: The value of while... — David Suarez de Lis <excalibor@...>
Hi all,
1 message
2000/01/12
[#1133] Re: Class variables... — David Suarez de Lis <excalibor@...>
Hi there,
2 messages
2000/01/12
[#1158] Is this expected behavior? — Dave Thomas <Dave@...>
6 messages
2000/01/21
[#1172] Re: Possible bug in ruby-man-1.4 — Huayin Wang <wang@...>
> |Well, I guess it comes down to what you mean by an integer
10 messages
2000/01/24
[#1177] Re: Possible bug in ruby-man-1.4
— Dave Thomas <Dave@...>
2000/01/25
matz@netlab.co.jp (Yukihiro Matsumoto) writes:
[#1188] Enumerable and index — Dave Thomas <Dave@...>
5 messages
2000/01/27
[#1193] Semantics of chomp/chop — Dave Thomas <Dave@...>
7 messages
2000/01/28
[#1197] Question about 'open' — Dave Thomas <Dave@...>
8 messages
2000/01/30
[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)) {