Improve self-initialization of the Random module, using /dev/urandom

when available.  The changes in byterun/win32.c are untested.


git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@12244 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
master
Xavier Leroy 2012-03-14 16:12:09 +00:00
parent f95e7f4a59
commit 44b6164bb0
8 changed files with 295 additions and 262 deletions

View File

@ -51,6 +51,8 @@ Standard library:
with user-provided hash functions. with user-provided hash functions.
- Marshal: marshalling of function values (flag Marshal.Closures) now - Marshal: marshalling of function values (flag Marshal.Closures) now
also works for functions that come from dynamically-loaded modules (PR#5215) also works for functions that come from dynamically-loaded modules (PR#5215)
- Random: more random initialization (Random.self_init()), using /dev/urandom
when available (e.g. Linux, FreeBSD, MacOS X, Solaris)
- Scanf: new function "unescaped" (PR#3888) - Scanf: new function "unescaped" (PR#3888)
- Set and Map: more efficient implementation of "filter" and "partition" - Set and Map: more efficient implementation of "filter" and "partition"
- String: new function "map" (PR#3888) - String: new function "map" (PR#3888)

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -291,27 +291,49 @@ CAMLprim value caml_sys_time(value unit)
} }
#ifdef _WIN32 #ifdef _WIN32
extern intnat caml_win32_random_seed (void); extern int caml_win32_random_seed (intnat data[16]);
#endif #endif
CAMLprim value caml_sys_random_seed (value unit) CAMLprim value caml_sys_random_seed (value unit)
{ {
intnat data[16];
int n, i;
value res;
#ifdef _WIN32 #ifdef _WIN32
return Val_long(caml_win32_random_seed()); n = caml_win32_random_seed(data);
#else #else
intnat seed; int fd;
n = 0;
/* Try /dev/urandom first */
fd = open("/dev/urandom", O_RDONLY, 0);
if (fd != -1) {
unsigned char buffer[12];
int nread = read(fd, buffer, 12);
close(fd);
while (nread > 0) data[n++] = buffer[--nread];
}
/* If the read from /dev/urandom fully succeeded, we now have 96 bits
of good random data and can stop here. Otherwise, complement
whatever we got (probably nothing) with some not-very-random data. */
if (n < 12) {
#ifdef HAS_GETTIMEOFDAY #ifdef HAS_GETTIMEOFDAY
struct timeval tv; struct timeval tv;
gettimeofday(&tv, NULL); gettimeofday(&tv, NULL);
seed = tv.tv_sec ^ tv.tv_usec; data[n++] = tv.tv_usec;
data[n++] = tv.tv_sec;
#else #else
seed = time (NULL); data[n++] = time(NULL);
#endif #endif
#ifdef HAS_UNISTD #ifdef HAS_UNISTD
seed ^= (getppid() << 16) ^ getpid(); data[n++] = getpid();
data[n++] = getppid();
#endif #endif
return Val_long(seed); }
#endif #endif
/* Convert to an OCaml array of ints */
res = caml_alloc_small(n, 0);
for (i = 0; i < n; i++) Field(res, i) = Val_long(data[i]);
return res;
} }
CAMLprim value caml_sys_get_config(value unit) CAMLprim value caml_sys_get_config(value unit)

View File

@ -528,18 +528,15 @@ void caml_win32_overflow_detection()
/* Seeding of pseudo-random number generators */ /* Seeding of pseudo-random number generators */
intnat caml_win32_random_seed (void) int caml_win32_random_seed (intnat data[16])
{ {
intnat seed; /* For better randomness, consider:
SYSTEMTIME t; http://msdn.microsoft.com/library/en-us/seccrypto/security/rtlgenrandom.asp
*/
GetLocalTime(&t); FILETIME t;
seed = t.wMonth; GetSystemTimeAsFileTime(&t);
seed = (seed << 5) ^ t.wDay; data[0] = t.dwLowDateTime;
seed = (seed << 4) ^ t.wHour; data[1] = t.dwHighDateTime;
seed = (seed << 5) ^ t.wMinute; data[2] = GetCurrentProcessId();
seed = (seed << 5) ^ t.wSecond; return 3;
seed = (seed << 9) ^ t.wMilliseconds;
seed ^= GetCurrentProcessId();
return seed;
} }

View File

@ -1,248 +1,260 @@
arg.cmi: arg.cmi :
array.cmi: array.cmi :
arrayLabels.cmi: arrayLabels.cmi :
buffer.cmi: buffer.cmi :
callback.cmi: callback.cmi :
camlinternalLazy.cmi: camlinternalLazy.cmi :
camlinternalMod.cmi: obj.cmi camlinternalMod.cmi : obj.cmi
camlinternalOO.cmi: obj.cmi camlinternalOO.cmi : obj.cmi
char.cmi: char.cmi :
complex.cmi: complex.cmi :
digest.cmi: digest.cmi :
filename.cmi: filename.cmi :
format.cmi: pervasives.cmi buffer.cmi format.cmi : pervasives.cmi buffer.cmi
gc.cmi: gc.cmi :
genlex.cmi: stream.cmi genlex.cmi : stream.cmi
hashtbl.cmi: hashtbl.cmi :
int32.cmi: int32.cmi :
int64.cmi: int64.cmi :
lazy.cmi: lazy.cmi :
lexing.cmi: lexing.cmi :
list.cmi: list.cmi :
listLabels.cmi: listLabels.cmi :
map.cmi: map.cmi :
marshal.cmi: marshal.cmi :
moreLabels.cmi: set.cmi map.cmi hashtbl.cmi moreLabels.cmi : set.cmi map.cmi hashtbl.cmi
nativeint.cmi: nativeint.cmi :
obj.cmi: int32.cmi obj.cmi : int32.cmi
oo.cmi: camlinternalOO.cmi oo.cmi : camlinternalOO.cmi
parsing.cmi: obj.cmi lexing.cmi parsing.cmi : obj.cmi lexing.cmi
pervasives.cmi: pervasives.cmi :
printexc.cmi: printexc.cmi :
printf.cmi: obj.cmi buffer.cmi printf.cmi : obj.cmi buffer.cmi
queue.cmi: queue.cmi :
random.cmi: nativeint.cmi int64.cmi int32.cmi random.cmi : nativeint.cmi int64.cmi int32.cmi
scanf.cmi: pervasives.cmi scanf.cmi : pervasives.cmi
set.cmi: set.cmi :
sort.cmi: sort.cmi :
stack.cmi: stack.cmi :
stdLabels.cmi: stdLabels.cmi :
stream.cmi: stream.cmi :
string.cmi: string.cmi :
stringLabels.cmi: stringLabels.cmi :
sys.cmi: sys.cmi :
weak.cmi: hashtbl.cmi weak.cmi : hashtbl.cmi
arg.cmo: sys.cmi string.cmi printf.cmi list.cmi buffer.cmi array.cmi arg.cmi arg.cmo : sys.cmi string.cmi printf.cmi list.cmi buffer.cmi array.cmi \
arg.cmx: sys.cmx string.cmx printf.cmx list.cmx buffer.cmx array.cmx arg.cmi arg.cmi
array.cmo: array.cmi arg.cmx : sys.cmx string.cmx printf.cmx list.cmx buffer.cmx array.cmx \
array.cmx: array.cmi arg.cmi
arrayLabels.cmo: array.cmi arrayLabels.cmi array.cmo : array.cmi
arrayLabels.cmx: array.cmx arrayLabels.cmi array.cmx : array.cmi
buffer.cmo: sys.cmi string.cmi buffer.cmi arrayLabels.cmo : array.cmi arrayLabels.cmi
buffer.cmx: sys.cmx string.cmx buffer.cmi arrayLabels.cmx : array.cmx arrayLabels.cmi
callback.cmo: obj.cmi callback.cmi buffer.cmo : sys.cmi string.cmi buffer.cmi
callback.cmx: obj.cmx callback.cmi buffer.cmx : sys.cmx string.cmx buffer.cmi
camlinternalLazy.cmo: obj.cmi camlinternalLazy.cmi callback.cmo : obj.cmi callback.cmi
camlinternalLazy.cmx: obj.cmx camlinternalLazy.cmi callback.cmx : obj.cmx callback.cmi
camlinternalMod.cmo: obj.cmi camlinternalOO.cmi array.cmi camlinternalMod.cmi camlinternalLazy.cmo : obj.cmi camlinternalLazy.cmi
camlinternalMod.cmx: obj.cmx camlinternalOO.cmx array.cmx camlinternalMod.cmi camlinternalLazy.cmx : obj.cmx camlinternalLazy.cmi
camlinternalOO.cmo: sys.cmi string.cmi obj.cmi map.cmi list.cmi char.cmi \ camlinternalMod.cmo : obj.cmi camlinternalOO.cmi array.cmi \
array.cmi camlinternalOO.cmi camlinternalMod.cmi
camlinternalOO.cmx: sys.cmx string.cmx obj.cmx map.cmx list.cmx char.cmx \ camlinternalMod.cmx : obj.cmx camlinternalOO.cmx array.cmx \
array.cmx camlinternalOO.cmi camlinternalMod.cmi
char.cmo: char.cmi camlinternalOO.cmo : sys.cmi string.cmi obj.cmi map.cmi list.cmi char.cmi \
char.cmx: char.cmi callback.cmi array.cmi camlinternalOO.cmi
complex.cmo: complex.cmi camlinternalOO.cmx : sys.cmx string.cmx obj.cmx map.cmx list.cmx char.cmx \
complex.cmx: complex.cmi callback.cmx array.cmx camlinternalOO.cmi
digest.cmo: string.cmi printf.cmi digest.cmi char.cmo : char.cmi
digest.cmx: string.cmx printf.cmx digest.cmi char.cmx : char.cmi
filename.cmo: sys.cmi string.cmi random.cmi printf.cmi buffer.cmi \ complex.cmo : complex.cmi
complex.cmx : complex.cmi
digest.cmo : string.cmi printf.cmi char.cmi digest.cmi
digest.cmx : string.cmx printf.cmx char.cmx digest.cmi
filename.cmo : sys.cmi string.cmi random.cmi printf.cmi buffer.cmi \
filename.cmi filename.cmi
filename.cmx: sys.cmx string.cmx random.cmx printf.cmx buffer.cmx \ filename.cmx : sys.cmx string.cmx random.cmx printf.cmx buffer.cmx \
filename.cmi filename.cmi
format.cmo: string.cmi printf.cmi pervasives.cmi obj.cmi list.cmi buffer.cmi \ format.cmo : string.cmi printf.cmi pervasives.cmi obj.cmi list.cmi \
format.cmi buffer.cmi format.cmi
format.cmx: string.cmx printf.cmx pervasives.cmx obj.cmx list.cmx buffer.cmx \ format.cmx : string.cmx printf.cmx pervasives.cmx obj.cmx list.cmx \
format.cmi buffer.cmx format.cmi
gc.cmo: sys.cmi printf.cmi gc.cmi gc.cmo : sys.cmi printf.cmi gc.cmi
gc.cmx: sys.cmx printf.cmx gc.cmi gc.cmx : sys.cmx printf.cmx gc.cmi
genlex.cmo: string.cmi stream.cmi list.cmi hashtbl.cmi char.cmi genlex.cmi genlex.cmo : string.cmi stream.cmi list.cmi hashtbl.cmi char.cmi genlex.cmi
genlex.cmx: string.cmx stream.cmx list.cmx hashtbl.cmx char.cmx genlex.cmi genlex.cmx : string.cmx stream.cmx list.cmx hashtbl.cmx char.cmx genlex.cmi
hashtbl.cmo: sys.cmi random.cmi obj.cmi array.cmi hashtbl.cmi hashtbl.cmo : sys.cmi obj.cmi array.cmi hashtbl.cmi
hashtbl.cmx: sys.cmx random.cmx obj.cmx array.cmx hashtbl.cmi hashtbl.cmx : sys.cmx obj.cmx array.cmx hashtbl.cmi
int32.cmo: pervasives.cmi int32.cmi int32.cmo : pervasives.cmi int32.cmi
int32.cmx: pervasives.cmx int32.cmi int32.cmx : pervasives.cmx int32.cmi
int64.cmo: pervasives.cmi int64.cmi int64.cmo : pervasives.cmi int64.cmi
int64.cmx: pervasives.cmx int64.cmi int64.cmx : pervasives.cmx int64.cmi
lazy.cmo: obj.cmi camlinternalLazy.cmi lazy.cmi lazy.cmo : obj.cmi camlinternalLazy.cmi lazy.cmi
lazy.cmx: obj.cmx camlinternalLazy.cmx lazy.cmi lazy.cmx : obj.cmx camlinternalLazy.cmx lazy.cmi
lexing.cmo: sys.cmi string.cmi array.cmi lexing.cmi lexing.cmo : sys.cmi string.cmi array.cmi lexing.cmi
lexing.cmx: sys.cmx string.cmx array.cmx lexing.cmi lexing.cmx : sys.cmx string.cmx array.cmx lexing.cmi
list.cmo: list.cmi list.cmo : list.cmi
list.cmx: list.cmi list.cmx : list.cmi
listLabels.cmo: list.cmi listLabels.cmi listLabels.cmo : list.cmi listLabels.cmi
listLabels.cmx: list.cmx listLabels.cmi listLabels.cmx : list.cmx listLabels.cmi
map.cmo: map.cmi map.cmo : map.cmi
map.cmx: map.cmi map.cmx : map.cmi
marshal.cmo: string.cmi marshal.cmi marshal.cmo : string.cmi marshal.cmi
marshal.cmx: string.cmx marshal.cmi marshal.cmx : string.cmx marshal.cmi
moreLabels.cmo: set.cmi map.cmi hashtbl.cmi moreLabels.cmi moreLabels.cmo : set.cmi map.cmi hashtbl.cmi moreLabels.cmi
moreLabels.cmx: set.cmx map.cmx hashtbl.cmx moreLabels.cmi moreLabels.cmx : set.cmx map.cmx hashtbl.cmx moreLabels.cmi
nativeint.cmo: sys.cmi pervasives.cmi nativeint.cmi nativeint.cmo : sys.cmi pervasives.cmi nativeint.cmi
nativeint.cmx: sys.cmx pervasives.cmx nativeint.cmi nativeint.cmx : sys.cmx pervasives.cmx nativeint.cmi
obj.cmo: marshal.cmi int32.cmi array.cmi obj.cmi obj.cmo : marshal.cmi int32.cmi array.cmi obj.cmi
obj.cmx: marshal.cmx int32.cmx array.cmx obj.cmi obj.cmx : marshal.cmx int32.cmx array.cmx obj.cmi
oo.cmo: camlinternalOO.cmi oo.cmi oo.cmo : camlinternalOO.cmi oo.cmi
oo.cmx: camlinternalOO.cmx oo.cmi oo.cmx : camlinternalOO.cmx oo.cmi
parsing.cmo: obj.cmi lexing.cmi array.cmi parsing.cmi parsing.cmo : obj.cmi lexing.cmi array.cmi parsing.cmi
parsing.cmx: obj.cmx lexing.cmx array.cmx parsing.cmi parsing.cmx : obj.cmx lexing.cmx array.cmx parsing.cmi
pervasives.cmo: pervasives.cmi pervasives.cmo : pervasives.cmi
pervasives.cmx: pervasives.cmi pervasives.cmx : pervasives.cmi
printexc.cmo: printf.cmi obj.cmi buffer.cmi array.cmi printexc.cmi printexc.cmo : printf.cmi obj.cmi buffer.cmi array.cmi printexc.cmi
printexc.cmx: printf.cmx obj.cmx buffer.cmx array.cmx printexc.cmi printexc.cmx : printf.cmx obj.cmx buffer.cmx array.cmx printexc.cmi
printf.cmo: string.cmi pervasives.cmi obj.cmi list.cmi char.cmi buffer.cmi \ printf.cmo : string.cmi pervasives.cmi obj.cmi list.cmi char.cmi buffer.cmi \
array.cmi printf.cmi array.cmi printf.cmi
printf.cmx: string.cmx pervasives.cmx obj.cmx list.cmx char.cmx buffer.cmx \ printf.cmx : string.cmx pervasives.cmx obj.cmx list.cmx char.cmx buffer.cmx \
array.cmx printf.cmi array.cmx printf.cmi
queue.cmo: obj.cmi queue.cmi queue.cmo : obj.cmi queue.cmi
queue.cmx: obj.cmx queue.cmi queue.cmx : obj.cmx queue.cmi
random.cmo: string.cmi pervasives.cmi nativeint.cmi int64.cmi int32.cmi \ random.cmo : string.cmi pervasives.cmi nativeint.cmi int64.cmi int32.cmi \
digest.cmi char.cmi array.cmi random.cmi digest.cmi char.cmi array.cmi random.cmi
random.cmx: string.cmx pervasives.cmx nativeint.cmx int64.cmx int32.cmx \ random.cmx : string.cmx pervasives.cmx nativeint.cmx int64.cmx int32.cmx \
digest.cmx char.cmx array.cmx random.cmi digest.cmx char.cmx array.cmx random.cmi
scanf.cmo: string.cmi printf.cmi pervasives.cmi obj.cmi list.cmi hashtbl.cmi \ scanf.cmo : string.cmi printf.cmi pervasives.cmi obj.cmi list.cmi \
buffer.cmi array.cmi scanf.cmi hashtbl.cmi buffer.cmi array.cmi scanf.cmi
scanf.cmx: string.cmx printf.cmx pervasives.cmx obj.cmx list.cmx hashtbl.cmx \ scanf.cmx : string.cmx printf.cmx pervasives.cmx obj.cmx list.cmx \
buffer.cmx array.cmx scanf.cmi hashtbl.cmx buffer.cmx array.cmx scanf.cmi
set.cmo: set.cmi set.cmo : set.cmi
set.cmx: set.cmi set.cmx : set.cmi
sort.cmo: array.cmi sort.cmi sort.cmo : array.cmi sort.cmi
sort.cmx: array.cmx sort.cmi sort.cmx : array.cmx sort.cmi
stack.cmo: list.cmi stack.cmi stack.cmo : list.cmi stack.cmi
stack.cmx: list.cmx stack.cmi stack.cmx : list.cmx stack.cmi
stdLabels.cmo: stringLabels.cmi listLabels.cmi arrayLabels.cmi stdLabels.cmi stdLabels.cmo : stringLabels.cmi listLabels.cmi arrayLabels.cmi \
stdLabels.cmx: stringLabels.cmx listLabels.cmx arrayLabels.cmx stdLabels.cmi stdLabels.cmi
std_exit.cmo: stdLabels.cmx : stringLabels.cmx listLabels.cmx arrayLabels.cmx \
std_exit.cmx: stdLabels.cmi
stream.cmo: string.cmi obj.cmi list.cmi lazy.cmi stream.cmi std_exit.cmo :
stream.cmx: string.cmx obj.cmx list.cmx lazy.cmx stream.cmi std_exit.cmx :
string.cmo: pervasives.cmi list.cmi char.cmi string.cmi stream.cmo : string.cmi obj.cmi list.cmi lazy.cmi stream.cmi
string.cmx: pervasives.cmx list.cmx char.cmx string.cmi stream.cmx : string.cmx obj.cmx list.cmx lazy.cmx stream.cmi
stringLabels.cmo: string.cmi stringLabels.cmi string.cmo : pervasives.cmi list.cmi char.cmi string.cmi
stringLabels.cmx: string.cmx stringLabels.cmi string.cmx : pervasives.cmx list.cmx char.cmx string.cmi
sys.cmo: sys.cmi stringLabels.cmo : string.cmi stringLabels.cmi
sys.cmx: sys.cmi stringLabels.cmx : string.cmx stringLabels.cmi
weak.cmo: sys.cmi obj.cmi hashtbl.cmi array.cmi weak.cmi sys.cmo : sys.cmi
weak.cmx: sys.cmx obj.cmx hashtbl.cmx array.cmx weak.cmi sys.cmx : sys.cmi
arg.cmo: sys.cmi string.cmi printf.cmi list.cmi buffer.cmi array.cmi arg.cmi weak.cmo : sys.cmi obj.cmi hashtbl.cmi array.cmi weak.cmi
arg.p.cmx: sys.p.cmx string.p.cmx printf.p.cmx list.p.cmx buffer.p.cmx array.p.cmx arg.cmi weak.cmx : sys.cmx obj.cmx hashtbl.cmx array.cmx weak.cmi
array.cmo: array.cmi arg.cmo : sys.cmi string.cmi printf.cmi list.cmi buffer.cmi array.cmi \
array.p.cmx: array.cmi arg.cmi
arrayLabels.cmo: array.cmi arrayLabels.cmi arg.p.cmx : sys.p.cmx string.p.cmx printf.p.cmx list.p.cmx buffer.p.cmx array.p.cmx \
arrayLabels.p.cmx: array.p.cmx arrayLabels.cmi arg.cmi
buffer.cmo: sys.cmi string.cmi buffer.cmi array.cmo : array.cmi
buffer.p.cmx: sys.p.cmx string.p.cmx buffer.cmi array.p.cmx : array.cmi
callback.cmo: obj.cmi callback.cmi arrayLabels.cmo : array.cmi arrayLabels.cmi
callback.p.cmx: obj.p.cmx callback.cmi arrayLabels.p.cmx : array.p.cmx arrayLabels.cmi
camlinternalLazy.cmo: obj.cmi camlinternalLazy.cmi buffer.cmo : sys.cmi string.cmi buffer.cmi
camlinternalLazy.p.cmx: obj.p.cmx camlinternalLazy.cmi buffer.p.cmx : sys.p.cmx string.p.cmx buffer.cmi
camlinternalMod.cmo: obj.cmi camlinternalOO.cmi array.cmi camlinternalMod.cmi callback.cmo : obj.cmi callback.cmi
camlinternalMod.p.cmx: obj.p.cmx camlinternalOO.p.cmx array.p.cmx camlinternalMod.cmi callback.p.cmx : obj.p.cmx callback.cmi
camlinternalOO.cmo: sys.cmi string.cmi obj.cmi map.cmi list.cmi char.cmi \ camlinternalLazy.cmo : obj.cmi camlinternalLazy.cmi
array.cmi camlinternalOO.cmi camlinternalLazy.p.cmx : obj.p.cmx camlinternalLazy.cmi
camlinternalOO.p.cmx: sys.p.cmx string.p.cmx obj.p.cmx map.p.cmx list.p.cmx char.p.cmx \ camlinternalMod.cmo : obj.cmi camlinternalOO.cmi array.cmi \
array.p.cmx camlinternalOO.cmi camlinternalMod.cmi
char.cmo: char.cmi camlinternalMod.p.cmx : obj.p.cmx camlinternalOO.p.cmx array.p.cmx \
char.p.cmx: char.cmi camlinternalMod.cmi
complex.cmo: complex.cmi camlinternalOO.cmo : sys.cmi string.cmi obj.cmi map.cmi list.cmi char.cmi \
complex.p.cmx: complex.cmi callback.cmi array.cmi camlinternalOO.cmi
digest.cmo: string.cmi printf.cmi digest.cmi camlinternalOO.p.cmx : sys.p.cmx string.p.cmx obj.p.cmx map.p.cmx list.p.cmx char.p.cmx \
digest.p.cmx: string.p.cmx printf.p.cmx digest.cmi callback.p.cmx array.p.cmx camlinternalOO.cmi
filename.cmo: sys.cmi string.cmi random.cmi printf.cmi buffer.cmi \ char.cmo : char.cmi
char.p.cmx : char.cmi
complex.cmo : complex.cmi
complex.p.cmx : complex.cmi
digest.cmo : string.cmi printf.cmi char.cmi digest.cmi
digest.p.cmx : string.p.cmx printf.p.cmx char.p.cmx digest.cmi
filename.cmo : sys.cmi string.cmi random.cmi printf.cmi buffer.cmi \
filename.cmi filename.cmi
filename.p.cmx: sys.p.cmx string.p.cmx random.p.cmx printf.p.cmx buffer.p.cmx \ filename.p.cmx : sys.p.cmx string.p.cmx random.p.cmx printf.p.cmx buffer.p.cmx \
filename.cmi filename.cmi
format.cmo: string.cmi printf.cmi pervasives.cmi obj.cmi list.cmi buffer.cmi \ format.cmo : string.cmi printf.cmi pervasives.cmi obj.cmi list.cmi \
format.cmi buffer.cmi format.cmi
format.p.cmx: string.p.cmx printf.p.cmx pervasives.p.cmx obj.p.cmx list.p.cmx buffer.p.cmx \ format.p.cmx : string.p.cmx printf.p.cmx pervasives.p.cmx obj.p.cmx list.p.cmx \
format.cmi buffer.p.cmx format.cmi
gc.cmo: sys.cmi printf.cmi gc.cmi gc.cmo : sys.cmi printf.cmi gc.cmi
gc.p.cmx: sys.p.cmx printf.p.cmx gc.cmi gc.p.cmx : sys.p.cmx printf.p.cmx gc.cmi
genlex.cmo: string.cmi stream.cmi list.cmi hashtbl.cmi char.cmi genlex.cmi genlex.cmo : string.cmi stream.cmi list.cmi hashtbl.cmi char.cmi genlex.cmi
genlex.p.cmx: string.p.cmx stream.p.cmx list.p.cmx hashtbl.p.cmx char.p.cmx genlex.cmi genlex.p.cmx : string.p.cmx stream.p.cmx list.p.cmx hashtbl.p.cmx char.p.cmx genlex.cmi
hashtbl.cmo: sys.cmi random.cmi obj.cmi array.cmi hashtbl.cmi hashtbl.cmo : sys.cmi obj.cmi array.cmi hashtbl.cmi
hashtbl.p.cmx: sys.p.cmx random.p.cmx obj.p.cmx array.p.cmx hashtbl.cmi hashtbl.p.cmx : sys.p.cmx obj.p.cmx array.p.cmx hashtbl.cmi
int32.cmo: pervasives.cmi int32.cmi int32.cmo : pervasives.cmi int32.cmi
int32.p.cmx: pervasives.p.cmx int32.cmi int32.p.cmx : pervasives.p.cmx int32.cmi
int64.cmo: pervasives.cmi int64.cmi int64.cmo : pervasives.cmi int64.cmi
int64.p.cmx: pervasives.p.cmx int64.cmi int64.p.cmx : pervasives.p.cmx int64.cmi
lazy.cmo: obj.cmi camlinternalLazy.cmi lazy.cmi lazy.cmo : obj.cmi camlinternalLazy.cmi lazy.cmi
lazy.p.cmx: obj.p.cmx camlinternalLazy.p.cmx lazy.cmi lazy.p.cmx : obj.p.cmx camlinternalLazy.p.cmx lazy.cmi
lexing.cmo: sys.cmi string.cmi array.cmi lexing.cmi lexing.cmo : sys.cmi string.cmi array.cmi lexing.cmi
lexing.p.cmx: sys.p.cmx string.p.cmx array.p.cmx lexing.cmi lexing.p.cmx : sys.p.cmx string.p.cmx array.p.cmx lexing.cmi
list.cmo: list.cmi list.cmo : list.cmi
list.p.cmx: list.cmi list.p.cmx : list.cmi
listLabels.cmo: list.cmi listLabels.cmi listLabels.cmo : list.cmi listLabels.cmi
listLabels.p.cmx: list.p.cmx listLabels.cmi listLabels.p.cmx : list.p.cmx listLabels.cmi
map.cmo: map.cmi map.cmo : map.cmi
map.p.cmx: map.cmi map.p.cmx : map.cmi
marshal.cmo: string.cmi marshal.cmi marshal.cmo : string.cmi marshal.cmi
marshal.p.cmx: string.p.cmx marshal.cmi marshal.p.cmx : string.p.cmx marshal.cmi
moreLabels.cmo: set.cmi map.cmi hashtbl.cmi moreLabels.cmi moreLabels.cmo : set.cmi map.cmi hashtbl.cmi moreLabels.cmi
moreLabels.p.cmx: set.p.cmx map.p.cmx hashtbl.p.cmx moreLabels.cmi moreLabels.p.cmx : set.p.cmx map.p.cmx hashtbl.p.cmx moreLabels.cmi
nativeint.cmo: sys.cmi pervasives.cmi nativeint.cmi nativeint.cmo : sys.cmi pervasives.cmi nativeint.cmi
nativeint.p.cmx: sys.p.cmx pervasives.p.cmx nativeint.cmi nativeint.p.cmx : sys.p.cmx pervasives.p.cmx nativeint.cmi
obj.cmo: marshal.cmi int32.cmi array.cmi obj.cmi obj.cmo : marshal.cmi int32.cmi array.cmi obj.cmi
obj.p.cmx: marshal.p.cmx int32.p.cmx array.p.cmx obj.cmi obj.p.cmx : marshal.p.cmx int32.p.cmx array.p.cmx obj.cmi
oo.cmo: camlinternalOO.cmi oo.cmi oo.cmo : camlinternalOO.cmi oo.cmi
oo.p.cmx: camlinternalOO.p.cmx oo.cmi oo.p.cmx : camlinternalOO.p.cmx oo.cmi
parsing.cmo: obj.cmi lexing.cmi array.cmi parsing.cmi parsing.cmo : obj.cmi lexing.cmi array.cmi parsing.cmi
parsing.p.cmx: obj.p.cmx lexing.p.cmx array.p.cmx parsing.cmi parsing.p.cmx : obj.p.cmx lexing.p.cmx array.p.cmx parsing.cmi
pervasives.cmo: pervasives.cmi pervasives.cmo : pervasives.cmi
pervasives.p.cmx: pervasives.cmi pervasives.p.cmx : pervasives.cmi
printexc.cmo: printf.cmi obj.cmi buffer.cmi array.cmi printexc.cmi printexc.cmo : printf.cmi obj.cmi buffer.cmi array.cmi printexc.cmi
printexc.p.cmx: printf.p.cmx obj.p.cmx buffer.p.cmx array.p.cmx printexc.cmi printexc.p.cmx : printf.p.cmx obj.p.cmx buffer.p.cmx array.p.cmx printexc.cmi
printf.cmo: string.cmi pervasives.cmi obj.cmi list.cmi char.cmi buffer.cmi \ printf.cmo : string.cmi pervasives.cmi obj.cmi list.cmi char.cmi buffer.cmi \
array.cmi printf.cmi array.cmi printf.cmi
printf.p.cmx: string.p.cmx pervasives.p.cmx obj.p.cmx list.p.cmx char.p.cmx buffer.p.cmx \ printf.p.cmx : string.p.cmx pervasives.p.cmx obj.p.cmx list.p.cmx char.p.cmx buffer.p.cmx \
array.p.cmx printf.cmi array.p.cmx printf.cmi
queue.cmo: obj.cmi queue.cmi queue.cmo : obj.cmi queue.cmi
queue.p.cmx: obj.p.cmx queue.cmi queue.p.cmx : obj.p.cmx queue.cmi
random.cmo: string.cmi pervasives.cmi nativeint.cmi int64.cmi int32.cmi \ random.cmo : string.cmi pervasives.cmi nativeint.cmi int64.cmi int32.cmi \
digest.cmi char.cmi array.cmi random.cmi digest.cmi char.cmi array.cmi random.cmi
random.p.cmx: string.p.cmx pervasives.p.cmx nativeint.p.cmx int64.p.cmx int32.p.cmx \ random.p.cmx : string.p.cmx pervasives.p.cmx nativeint.p.cmx int64.p.cmx int32.p.cmx \
digest.p.cmx char.p.cmx array.p.cmx random.cmi digest.p.cmx char.p.cmx array.p.cmx random.cmi
scanf.cmo: string.cmi printf.cmi pervasives.cmi obj.cmi list.cmi hashtbl.cmi \ scanf.cmo : string.cmi printf.cmi pervasives.cmi obj.cmi list.cmi \
buffer.cmi array.cmi scanf.cmi hashtbl.cmi buffer.cmi array.cmi scanf.cmi
scanf.p.cmx: string.p.cmx printf.p.cmx pervasives.p.cmx obj.p.cmx list.p.cmx hashtbl.p.cmx \ scanf.p.cmx : string.p.cmx printf.p.cmx pervasives.p.cmx obj.p.cmx list.p.cmx \
buffer.p.cmx array.p.cmx scanf.cmi hashtbl.p.cmx buffer.p.cmx array.p.cmx scanf.cmi
set.cmo: set.cmi set.cmo : set.cmi
set.p.cmx: set.cmi set.p.cmx : set.cmi
sort.cmo: array.cmi sort.cmi sort.cmo : array.cmi sort.cmi
sort.p.cmx: array.p.cmx sort.cmi sort.p.cmx : array.p.cmx sort.cmi
stack.cmo: list.cmi stack.cmi stack.cmo : list.cmi stack.cmi
stack.p.cmx: list.p.cmx stack.cmi stack.p.cmx : list.p.cmx stack.cmi
stdLabels.cmo: stringLabels.cmi listLabels.cmi arrayLabels.cmi stdLabels.cmi stdLabels.cmo : stringLabels.cmi listLabels.cmi arrayLabels.cmi \
stdLabels.p.cmx: stringLabels.p.cmx listLabels.p.cmx arrayLabels.p.cmx stdLabels.cmi stdLabels.cmi
std_exit.cmo: stdLabels.p.cmx : stringLabels.p.cmx listLabels.p.cmx arrayLabels.p.cmx \
std_exit.p.cmx: stdLabels.cmi
stream.cmo: string.cmi obj.cmi list.cmi lazy.cmi stream.cmi std_exit.cmo :
stream.p.cmx: string.p.cmx obj.p.cmx list.p.cmx lazy.p.cmx stream.cmi std_exit.p.cmx :
string.cmo: pervasives.cmi list.cmi char.cmi string.cmi stream.cmo : string.cmi obj.cmi list.cmi lazy.cmi stream.cmi
string.p.cmx: pervasives.p.cmx list.p.cmx char.p.cmx string.cmi stream.p.cmx : string.p.cmx obj.p.cmx list.p.cmx lazy.p.cmx stream.cmi
stringLabels.cmo: string.cmi stringLabels.cmi string.cmo : pervasives.cmi list.cmi char.cmi string.cmi
stringLabels.p.cmx: string.p.cmx stringLabels.cmi string.p.cmx : pervasives.p.cmx list.p.cmx char.p.cmx string.cmi
sys.cmo: sys.cmi stringLabels.cmo : string.cmi stringLabels.cmi
sys.p.cmx: sys.cmi stringLabels.p.cmx : string.p.cmx stringLabels.cmi
weak.cmo: sys.cmi obj.cmi hashtbl.cmi array.cmi weak.cmi sys.cmo : sys.cmi
weak.p.cmx: sys.p.cmx obj.p.cmx hashtbl.p.cmx array.p.cmx weak.cmi sys.p.cmx : sys.cmi
weak.cmo : sys.cmi obj.cmi hashtbl.cmi array.cmi weak.cmi
weak.p.cmx : sys.p.cmx obj.p.cmx hashtbl.p.cmx array.p.cmx weak.cmi

View File

@ -25,7 +25,7 @@
passes all the Diehard tests. passes all the Diehard tests.
*) *)
external random_seed: unit -> int = "caml_sys_random_seed";; external random_seed: unit -> int array = "caml_sys_random_seed";;
module State = struct module State = struct
@ -43,7 +43,7 @@ module State = struct
Char.code d.[0] + (Char.code d.[1] lsl 8) + (Char.code d.[2] lsl 16) Char.code d.[0] + (Char.code d.[1] lsl 8) + (Char.code d.[2] lsl 16)
+ (Char.code d.[3] lsl 24) + (Char.code d.[3] lsl 24)
in in
let seed = if seed = [| |] then [| 0 |] else seed in let seed = if Array.length seed = 0 then [| 0 |] else seed in
let l = Array.length seed in let l = Array.length seed in
for i = 0 to 54 do for i = 0 to 54 do
s.st.(i) <- i; s.st.(i) <- i;
@ -64,7 +64,7 @@ module State = struct
result result
;; ;;
let make_self_init () = make [| random_seed () |];; let make_self_init () = make (random_seed ());;
let copy s = let copy s =
let result = new_state () in let result = new_state () in
@ -172,7 +172,7 @@ let bool () = State.bool default;;
let full_init seed = State.full_init default seed;; let full_init seed = State.full_init default seed;;
let init seed = State.full_init default [| seed |];; let init seed = State.full_init default [| seed |];;
let self_init () = init (random_seed());; let self_init () = full_init (random_seed());;
(* Manipulating the current state. *) (* Manipulating the current state. *)