diff options
-rw-r--r-- | Changes | 2 | ||||
-rwxr-xr-x | boot/ocamlc | bin | 1181795 -> 1181731 bytes | |||
-rwxr-xr-x | boot/ocamldep | bin | 319278 -> 319022 bytes | |||
-rwxr-xr-x | boot/ocamllex | bin | 172301 -> 172296 bytes | |||
-rw-r--r-- | byterun/sys.c | 40 | ||||
-rw-r--r-- | byterun/win32.c | 23 | ||||
-rw-r--r-- | stdlib/.depend | 484 | ||||
-rw-r--r-- | stdlib/random.ml | 8 |
8 files changed, 295 insertions, 262 deletions
@@ -51,6 +51,8 @@ Standard library: with user-provided hash functions. - Marshal: marshalling of function values (flag Marshal.Closures) now 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) - Set and Map: more efficient implementation of "filter" and "partition" - String: new function "map" (PR#3888) diff --git a/boot/ocamlc b/boot/ocamlc Binary files differindex 17998d3aa..b956cb8c4 100755 --- a/boot/ocamlc +++ b/boot/ocamlc diff --git a/boot/ocamldep b/boot/ocamldep Binary files differindex ba9a71666..59091f53a 100755 --- a/boot/ocamldep +++ b/boot/ocamldep diff --git a/boot/ocamllex b/boot/ocamllex Binary files differindex c0adcd904..3ffaaf5a0 100755 --- a/boot/ocamllex +++ b/boot/ocamllex diff --git a/byterun/sys.c b/byterun/sys.c index dcc290756..ce364d8c1 100644 --- a/byterun/sys.c +++ b/byterun/sys.c @@ -291,27 +291,49 @@ CAMLprim value caml_sys_time(value unit) } #ifdef _WIN32 -extern intnat caml_win32_random_seed (void); +extern int caml_win32_random_seed (intnat data[16]); #endif CAMLprim value caml_sys_random_seed (value unit) { + intnat data[16]; + int n, i; + value res; #ifdef _WIN32 - return Val_long(caml_win32_random_seed()); + n = caml_win32_random_seed(data); #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 - struct timeval tv; - gettimeofday(&tv, NULL); - seed = tv.tv_sec ^ tv.tv_usec; + struct timeval tv; + gettimeofday(&tv, NULL); + data[n++] = tv.tv_usec; + data[n++] = tv.tv_sec; #else - seed = time (NULL); + data[n++] = time(NULL); #endif #ifdef HAS_UNISTD - seed ^= (getppid() << 16) ^ getpid(); + data[n++] = getpid(); + data[n++] = getppid(); #endif - return Val_long(seed); + } #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) diff --git a/byterun/win32.c b/byterun/win32.c index e958fd6f2..4cc384152 100644 --- a/byterun/win32.c +++ b/byterun/win32.c @@ -528,18 +528,15 @@ void caml_win32_overflow_detection() /* Seeding of pseudo-random number generators */ -intnat caml_win32_random_seed (void) +int caml_win32_random_seed (intnat data[16]) { - intnat seed; - SYSTEMTIME t; - - GetLocalTime(&t); - seed = t.wMonth; - seed = (seed << 5) ^ t.wDay; - seed = (seed << 4) ^ t.wHour; - seed = (seed << 5) ^ t.wMinute; - seed = (seed << 5) ^ t.wSecond; - seed = (seed << 9) ^ t.wMilliseconds; - seed ^= GetCurrentProcessId(); - return seed; + /* For better randomness, consider: + http://msdn.microsoft.com/library/en-us/seccrypto/security/rtlgenrandom.asp + */ + FILETIME t; + GetSystemTimeAsFileTime(&t); + data[0] = t.dwLowDateTime; + data[1] = t.dwHighDateTime; + data[2] = GetCurrentProcessId(); + return 3; } diff --git a/stdlib/.depend b/stdlib/.depend index 52ea959d4..3fd2959bc 100644 --- a/stdlib/.depend +++ b/stdlib/.depend @@ -1,248 +1,260 @@ -arg.cmi: -array.cmi: -arrayLabels.cmi: -buffer.cmi: -callback.cmi: -camlinternalLazy.cmi: -camlinternalMod.cmi: obj.cmi -camlinternalOO.cmi: obj.cmi -char.cmi: -complex.cmi: -digest.cmi: -filename.cmi: -format.cmi: pervasives.cmi buffer.cmi -gc.cmi: -genlex.cmi: stream.cmi -hashtbl.cmi: -int32.cmi: -int64.cmi: -lazy.cmi: -lexing.cmi: -list.cmi: -listLabels.cmi: -map.cmi: -marshal.cmi: -moreLabels.cmi: set.cmi map.cmi hashtbl.cmi -nativeint.cmi: -obj.cmi: int32.cmi -oo.cmi: camlinternalOO.cmi -parsing.cmi: obj.cmi lexing.cmi -pervasives.cmi: -printexc.cmi: -printf.cmi: obj.cmi buffer.cmi -queue.cmi: -random.cmi: nativeint.cmi int64.cmi int32.cmi -scanf.cmi: pervasives.cmi -set.cmi: -sort.cmi: -stack.cmi: -stdLabels.cmi: -stream.cmi: -string.cmi: -stringLabels.cmi: -sys.cmi: -weak.cmi: hashtbl.cmi -arg.cmo: sys.cmi string.cmi printf.cmi list.cmi buffer.cmi array.cmi arg.cmi -arg.cmx: sys.cmx string.cmx printf.cmx list.cmx buffer.cmx array.cmx arg.cmi -array.cmo: array.cmi -array.cmx: array.cmi -arrayLabels.cmo: array.cmi arrayLabels.cmi -arrayLabels.cmx: array.cmx arrayLabels.cmi -buffer.cmo: sys.cmi string.cmi buffer.cmi -buffer.cmx: sys.cmx string.cmx buffer.cmi -callback.cmo: obj.cmi callback.cmi -callback.cmx: obj.cmx callback.cmi -camlinternalLazy.cmo: obj.cmi camlinternalLazy.cmi -camlinternalLazy.cmx: obj.cmx camlinternalLazy.cmi -camlinternalMod.cmo: obj.cmi camlinternalOO.cmi array.cmi camlinternalMod.cmi -camlinternalMod.cmx: obj.cmx camlinternalOO.cmx array.cmx camlinternalMod.cmi -camlinternalOO.cmo: sys.cmi string.cmi obj.cmi map.cmi list.cmi char.cmi \ - array.cmi camlinternalOO.cmi -camlinternalOO.cmx: sys.cmx string.cmx obj.cmx map.cmx list.cmx char.cmx \ - array.cmx camlinternalOO.cmi -char.cmo: char.cmi -char.cmx: char.cmi -complex.cmo: complex.cmi -complex.cmx: complex.cmi -digest.cmo: string.cmi printf.cmi digest.cmi -digest.cmx: string.cmx printf.cmx digest.cmi -filename.cmo: sys.cmi string.cmi random.cmi printf.cmi buffer.cmi \ +arg.cmi : +array.cmi : +arrayLabels.cmi : +buffer.cmi : +callback.cmi : +camlinternalLazy.cmi : +camlinternalMod.cmi : obj.cmi +camlinternalOO.cmi : obj.cmi +char.cmi : +complex.cmi : +digest.cmi : +filename.cmi : +format.cmi : pervasives.cmi buffer.cmi +gc.cmi : +genlex.cmi : stream.cmi +hashtbl.cmi : +int32.cmi : +int64.cmi : +lazy.cmi : +lexing.cmi : +list.cmi : +listLabels.cmi : +map.cmi : +marshal.cmi : +moreLabels.cmi : set.cmi map.cmi hashtbl.cmi +nativeint.cmi : +obj.cmi : int32.cmi +oo.cmi : camlinternalOO.cmi +parsing.cmi : obj.cmi lexing.cmi +pervasives.cmi : +printexc.cmi : +printf.cmi : obj.cmi buffer.cmi +queue.cmi : +random.cmi : nativeint.cmi int64.cmi int32.cmi +scanf.cmi : pervasives.cmi +set.cmi : +sort.cmi : +stack.cmi : +stdLabels.cmi : +stream.cmi : +string.cmi : +stringLabels.cmi : +sys.cmi : +weak.cmi : hashtbl.cmi +arg.cmo : sys.cmi string.cmi printf.cmi list.cmi buffer.cmi array.cmi \ + arg.cmi +arg.cmx : sys.cmx string.cmx printf.cmx list.cmx buffer.cmx array.cmx \ + arg.cmi +array.cmo : array.cmi +array.cmx : array.cmi +arrayLabels.cmo : array.cmi arrayLabels.cmi +arrayLabels.cmx : array.cmx arrayLabels.cmi +buffer.cmo : sys.cmi string.cmi buffer.cmi +buffer.cmx : sys.cmx string.cmx buffer.cmi +callback.cmo : obj.cmi callback.cmi +callback.cmx : obj.cmx callback.cmi +camlinternalLazy.cmo : obj.cmi camlinternalLazy.cmi +camlinternalLazy.cmx : obj.cmx camlinternalLazy.cmi +camlinternalMod.cmo : obj.cmi camlinternalOO.cmi array.cmi \ + camlinternalMod.cmi +camlinternalMod.cmx : obj.cmx camlinternalOO.cmx array.cmx \ + camlinternalMod.cmi +camlinternalOO.cmo : sys.cmi string.cmi obj.cmi map.cmi list.cmi char.cmi \ + callback.cmi array.cmi camlinternalOO.cmi +camlinternalOO.cmx : sys.cmx string.cmx obj.cmx map.cmx list.cmx char.cmx \ + callback.cmx array.cmx camlinternalOO.cmi +char.cmo : char.cmi +char.cmx : char.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.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 -format.cmo: string.cmi printf.cmi pervasives.cmi obj.cmi list.cmi buffer.cmi \ - format.cmi -format.cmx: string.cmx printf.cmx pervasives.cmx obj.cmx list.cmx buffer.cmx \ - format.cmi -gc.cmo: sys.cmi printf.cmi 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.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.cmx: sys.cmx random.cmx obj.cmx array.cmx hashtbl.cmi -int32.cmo: pervasives.cmi int32.cmi -int32.cmx: pervasives.cmx int32.cmi -int64.cmo: pervasives.cmi int64.cmi -int64.cmx: pervasives.cmx int64.cmi -lazy.cmo: obj.cmi camlinternalLazy.cmi lazy.cmi -lazy.cmx: obj.cmx camlinternalLazy.cmx lazy.cmi -lexing.cmo: sys.cmi string.cmi array.cmi lexing.cmi -lexing.cmx: sys.cmx string.cmx array.cmx lexing.cmi -list.cmo: list.cmi -list.cmx: list.cmi -listLabels.cmo: list.cmi listLabels.cmi -listLabels.cmx: list.cmx listLabels.cmi -map.cmo: map.cmi -map.cmx: map.cmi -marshal.cmo: string.cmi marshal.cmi -marshal.cmx: string.cmx marshal.cmi -moreLabels.cmo: set.cmi map.cmi hashtbl.cmi moreLabels.cmi -moreLabels.cmx: set.cmx map.cmx hashtbl.cmx moreLabels.cmi -nativeint.cmo: sys.cmi pervasives.cmi nativeint.cmi -nativeint.cmx: sys.cmx pervasives.cmx nativeint.cmi -obj.cmo: marshal.cmi int32.cmi array.cmi obj.cmi -obj.cmx: marshal.cmx int32.cmx array.cmx obj.cmi -oo.cmo: camlinternalOO.cmi oo.cmi -oo.cmx: camlinternalOO.cmx oo.cmi -parsing.cmo: obj.cmi lexing.cmi array.cmi parsing.cmi -parsing.cmx: obj.cmx lexing.cmx array.cmx parsing.cmi -pervasives.cmo: pervasives.cmi -pervasives.cmx: pervasives.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 -printf.cmo: string.cmi pervasives.cmi obj.cmi list.cmi char.cmi buffer.cmi \ +format.cmo : string.cmi printf.cmi pervasives.cmi obj.cmi list.cmi \ + buffer.cmi format.cmi +format.cmx : string.cmx printf.cmx pervasives.cmx obj.cmx list.cmx \ + buffer.cmx format.cmi +gc.cmo : sys.cmi printf.cmi 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.cmx : string.cmx stream.cmx list.cmx hashtbl.cmx char.cmx genlex.cmi +hashtbl.cmo : sys.cmi obj.cmi array.cmi hashtbl.cmi +hashtbl.cmx : sys.cmx obj.cmx array.cmx hashtbl.cmi +int32.cmo : pervasives.cmi int32.cmi +int32.cmx : pervasives.cmx int32.cmi +int64.cmo : pervasives.cmi int64.cmi +int64.cmx : pervasives.cmx int64.cmi +lazy.cmo : obj.cmi camlinternalLazy.cmi lazy.cmi +lazy.cmx : obj.cmx camlinternalLazy.cmx lazy.cmi +lexing.cmo : sys.cmi string.cmi array.cmi lexing.cmi +lexing.cmx : sys.cmx string.cmx array.cmx lexing.cmi +list.cmo : list.cmi +list.cmx : list.cmi +listLabels.cmo : list.cmi listLabels.cmi +listLabels.cmx : list.cmx listLabels.cmi +map.cmo : map.cmi +map.cmx : map.cmi +marshal.cmo : string.cmi marshal.cmi +marshal.cmx : string.cmx marshal.cmi +moreLabels.cmo : set.cmi map.cmi hashtbl.cmi moreLabels.cmi +moreLabels.cmx : set.cmx map.cmx hashtbl.cmx moreLabels.cmi +nativeint.cmo : sys.cmi pervasives.cmi nativeint.cmi +nativeint.cmx : sys.cmx pervasives.cmx nativeint.cmi +obj.cmo : marshal.cmi int32.cmi array.cmi obj.cmi +obj.cmx : marshal.cmx int32.cmx array.cmx obj.cmi +oo.cmo : camlinternalOO.cmi oo.cmi +oo.cmx : camlinternalOO.cmx oo.cmi +parsing.cmo : obj.cmi lexing.cmi array.cmi parsing.cmi +parsing.cmx : obj.cmx lexing.cmx array.cmx parsing.cmi +pervasives.cmo : pervasives.cmi +pervasives.cmx : pervasives.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 +printf.cmo : string.cmi pervasives.cmi obj.cmi list.cmi char.cmi buffer.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 -queue.cmo: obj.cmi queue.cmi -queue.cmx: obj.cmx queue.cmi -random.cmo: string.cmi pervasives.cmi nativeint.cmi int64.cmi int32.cmi \ +queue.cmo : obj.cmi queue.cmi +queue.cmx : obj.cmx queue.cmi +random.cmo : string.cmi pervasives.cmi nativeint.cmi int64.cmi int32.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 -scanf.cmo: string.cmi printf.cmi pervasives.cmi obj.cmi list.cmi hashtbl.cmi \ - buffer.cmi array.cmi scanf.cmi -scanf.cmx: string.cmx printf.cmx pervasives.cmx obj.cmx list.cmx hashtbl.cmx \ - buffer.cmx array.cmx scanf.cmi -set.cmo: set.cmi -set.cmx: set.cmi -sort.cmo: array.cmi sort.cmi -sort.cmx: array.cmx sort.cmi -stack.cmo: list.cmi stack.cmi -stack.cmx: list.cmx stack.cmi -stdLabels.cmo: stringLabels.cmi listLabels.cmi arrayLabels.cmi stdLabels.cmi -stdLabels.cmx: stringLabels.cmx listLabels.cmx arrayLabels.cmx stdLabels.cmi -std_exit.cmo: -std_exit.cmx: -stream.cmo: string.cmi obj.cmi list.cmi lazy.cmi stream.cmi -stream.cmx: string.cmx obj.cmx list.cmx lazy.cmx stream.cmi -string.cmo: pervasives.cmi list.cmi char.cmi string.cmi -string.cmx: pervasives.cmx list.cmx char.cmx string.cmi -stringLabels.cmo: string.cmi stringLabels.cmi -stringLabels.cmx: string.cmx stringLabels.cmi -sys.cmo: sys.cmi -sys.cmx: sys.cmi -weak.cmo: sys.cmi obj.cmi hashtbl.cmi array.cmi weak.cmi -weak.cmx: sys.cmx obj.cmx hashtbl.cmx array.cmx weak.cmi -arg.cmo: sys.cmi string.cmi printf.cmi list.cmi buffer.cmi array.cmi arg.cmi -arg.p.cmx: sys.p.cmx string.p.cmx printf.p.cmx list.p.cmx buffer.p.cmx array.p.cmx arg.cmi -array.cmo: array.cmi -array.p.cmx: array.cmi -arrayLabels.cmo: array.cmi arrayLabels.cmi -arrayLabels.p.cmx: array.p.cmx arrayLabels.cmi -buffer.cmo: sys.cmi string.cmi buffer.cmi -buffer.p.cmx: sys.p.cmx string.p.cmx buffer.cmi -callback.cmo: obj.cmi callback.cmi -callback.p.cmx: obj.p.cmx callback.cmi -camlinternalLazy.cmo: obj.cmi camlinternalLazy.cmi -camlinternalLazy.p.cmx: obj.p.cmx camlinternalLazy.cmi -camlinternalMod.cmo: obj.cmi camlinternalOO.cmi array.cmi camlinternalMod.cmi -camlinternalMod.p.cmx: obj.p.cmx camlinternalOO.p.cmx array.p.cmx camlinternalMod.cmi -camlinternalOO.cmo: sys.cmi string.cmi obj.cmi map.cmi list.cmi char.cmi \ - array.cmi camlinternalOO.cmi -camlinternalOO.p.cmx: sys.p.cmx string.p.cmx obj.p.cmx map.p.cmx list.p.cmx char.p.cmx \ - array.p.cmx camlinternalOO.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 digest.cmi -digest.p.cmx: string.p.cmx printf.p.cmx digest.cmi -filename.cmo: sys.cmi string.cmi random.cmi printf.cmi buffer.cmi \ +scanf.cmo : string.cmi printf.cmi pervasives.cmi obj.cmi list.cmi \ + hashtbl.cmi buffer.cmi array.cmi scanf.cmi +scanf.cmx : string.cmx printf.cmx pervasives.cmx obj.cmx list.cmx \ + hashtbl.cmx buffer.cmx array.cmx scanf.cmi +set.cmo : set.cmi +set.cmx : set.cmi +sort.cmo : array.cmi sort.cmi +sort.cmx : array.cmx sort.cmi +stack.cmo : list.cmi stack.cmi +stack.cmx : list.cmx stack.cmi +stdLabels.cmo : stringLabels.cmi listLabels.cmi arrayLabels.cmi \ + stdLabels.cmi +stdLabels.cmx : stringLabels.cmx listLabels.cmx arrayLabels.cmx \ + stdLabels.cmi +std_exit.cmo : +std_exit.cmx : +stream.cmo : string.cmi obj.cmi list.cmi lazy.cmi stream.cmi +stream.cmx : string.cmx obj.cmx list.cmx lazy.cmx stream.cmi +string.cmo : pervasives.cmi list.cmi char.cmi string.cmi +string.cmx : pervasives.cmx list.cmx char.cmx string.cmi +stringLabels.cmo : string.cmi stringLabels.cmi +stringLabels.cmx : string.cmx stringLabels.cmi +sys.cmo : sys.cmi +sys.cmx : sys.cmi +weak.cmo : sys.cmi obj.cmi hashtbl.cmi array.cmi weak.cmi +weak.cmx : sys.cmx obj.cmx hashtbl.cmx array.cmx weak.cmi +arg.cmo : sys.cmi string.cmi printf.cmi list.cmi buffer.cmi array.cmi \ + arg.cmi +arg.p.cmx : sys.p.cmx string.p.cmx printf.p.cmx list.p.cmx buffer.p.cmx array.p.cmx \ + arg.cmi +array.cmo : array.cmi +array.p.cmx : array.cmi +arrayLabels.cmo : array.cmi arrayLabels.cmi +arrayLabels.p.cmx : array.p.cmx arrayLabels.cmi +buffer.cmo : sys.cmi string.cmi buffer.cmi +buffer.p.cmx : sys.p.cmx string.p.cmx buffer.cmi +callback.cmo : obj.cmi callback.cmi +callback.p.cmx : obj.p.cmx callback.cmi +camlinternalLazy.cmo : obj.cmi camlinternalLazy.cmi +camlinternalLazy.p.cmx : obj.p.cmx camlinternalLazy.cmi +camlinternalMod.cmo : obj.cmi camlinternalOO.cmi array.cmi \ + camlinternalMod.cmi +camlinternalMod.p.cmx : obj.p.cmx camlinternalOO.p.cmx array.p.cmx \ + camlinternalMod.cmi +camlinternalOO.cmo : sys.cmi string.cmi obj.cmi map.cmi list.cmi char.cmi \ + callback.cmi array.cmi camlinternalOO.cmi +camlinternalOO.p.cmx : sys.p.cmx string.p.cmx obj.p.cmx map.p.cmx list.p.cmx char.p.cmx \ + callback.p.cmx array.p.cmx camlinternalOO.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.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 -format.cmo: string.cmi printf.cmi pervasives.cmi obj.cmi list.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.cmi -gc.cmo: sys.cmi printf.cmi 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.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.p.cmx: sys.p.cmx random.p.cmx obj.p.cmx array.p.cmx hashtbl.cmi -int32.cmo: pervasives.cmi int32.cmi -int32.p.cmx: pervasives.p.cmx int32.cmi -int64.cmo: pervasives.cmi int64.cmi -int64.p.cmx: pervasives.p.cmx int64.cmi -lazy.cmo: obj.cmi camlinternalLazy.cmi lazy.cmi -lazy.p.cmx: obj.p.cmx camlinternalLazy.p.cmx lazy.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 -list.cmo: list.cmi -list.p.cmx: list.cmi -listLabels.cmo: list.cmi listLabels.cmi -listLabels.p.cmx: list.p.cmx listLabels.cmi -map.cmo: map.cmi -map.p.cmx: map.cmi -marshal.cmo: string.cmi marshal.cmi -marshal.p.cmx: string.p.cmx marshal.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 -nativeint.cmo: sys.cmi pervasives.cmi nativeint.cmi -nativeint.p.cmx: sys.p.cmx pervasives.p.cmx nativeint.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 -oo.cmo: camlinternalOO.cmi oo.cmi -oo.p.cmx: camlinternalOO.p.cmx oo.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 -pervasives.cmo: pervasives.cmi -pervasives.p.cmx: pervasives.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 -printf.cmo: string.cmi pervasives.cmi obj.cmi list.cmi char.cmi buffer.cmi \ +format.cmo : string.cmi printf.cmi pervasives.cmi obj.cmi list.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.cmi +gc.cmo : sys.cmi printf.cmi 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.p.cmx : string.p.cmx stream.p.cmx list.p.cmx hashtbl.p.cmx char.p.cmx genlex.cmi +hashtbl.cmo : sys.cmi obj.cmi array.cmi hashtbl.cmi +hashtbl.p.cmx : sys.p.cmx obj.p.cmx array.p.cmx hashtbl.cmi +int32.cmo : pervasives.cmi int32.cmi +int32.p.cmx : pervasives.p.cmx int32.cmi +int64.cmo : pervasives.cmi int64.cmi +int64.p.cmx : pervasives.p.cmx int64.cmi +lazy.cmo : obj.cmi camlinternalLazy.cmi lazy.cmi +lazy.p.cmx : obj.p.cmx camlinternalLazy.p.cmx lazy.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 +list.cmo : list.cmi +list.p.cmx : list.cmi +listLabels.cmo : list.cmi listLabels.cmi +listLabels.p.cmx : list.p.cmx listLabels.cmi +map.cmo : map.cmi +map.p.cmx : map.cmi +marshal.cmo : string.cmi marshal.cmi +marshal.p.cmx : string.p.cmx marshal.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 +nativeint.cmo : sys.cmi pervasives.cmi nativeint.cmi +nativeint.p.cmx : sys.p.cmx pervasives.p.cmx nativeint.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 +oo.cmo : camlinternalOO.cmi oo.cmi +oo.p.cmx : camlinternalOO.p.cmx oo.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 +pervasives.cmo : pervasives.cmi +pervasives.p.cmx : pervasives.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 +printf.cmo : string.cmi pervasives.cmi obj.cmi list.cmi char.cmi buffer.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 -queue.cmo: obj.cmi queue.cmi -queue.p.cmx: obj.p.cmx queue.cmi -random.cmo: string.cmi pervasives.cmi nativeint.cmi int64.cmi int32.cmi \ +queue.cmo : obj.cmi queue.cmi +queue.p.cmx : obj.p.cmx queue.cmi +random.cmo : string.cmi pervasives.cmi nativeint.cmi int64.cmi int32.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 -scanf.cmo: string.cmi printf.cmi pervasives.cmi obj.cmi list.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 \ - buffer.p.cmx array.p.cmx scanf.cmi -set.cmo: set.cmi -set.p.cmx: set.cmi -sort.cmo: array.cmi sort.cmi -sort.p.cmx: array.p.cmx sort.cmi -stack.cmo: list.cmi stack.cmi -stack.p.cmx: list.p.cmx stack.cmi -stdLabels.cmo: stringLabels.cmi listLabels.cmi arrayLabels.cmi stdLabels.cmi -stdLabels.p.cmx: stringLabels.p.cmx listLabels.p.cmx arrayLabels.p.cmx stdLabels.cmi -std_exit.cmo: -std_exit.p.cmx: -stream.cmo: string.cmi obj.cmi list.cmi lazy.cmi stream.cmi -stream.p.cmx: string.p.cmx obj.p.cmx list.p.cmx lazy.p.cmx stream.cmi -string.cmo: pervasives.cmi list.cmi char.cmi string.cmi -string.p.cmx: pervasives.p.cmx list.p.cmx char.p.cmx string.cmi -stringLabels.cmo: string.cmi stringLabels.cmi -stringLabels.p.cmx: string.p.cmx stringLabels.cmi -sys.cmo: sys.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 +scanf.cmo : string.cmi printf.cmi pervasives.cmi obj.cmi list.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 buffer.p.cmx array.p.cmx scanf.cmi +set.cmo : set.cmi +set.p.cmx : set.cmi +sort.cmo : array.cmi sort.cmi +sort.p.cmx : array.p.cmx sort.cmi +stack.cmo : list.cmi stack.cmi +stack.p.cmx : list.p.cmx stack.cmi +stdLabels.cmo : stringLabels.cmi listLabels.cmi arrayLabels.cmi \ + stdLabels.cmi +stdLabels.p.cmx : stringLabels.p.cmx listLabels.p.cmx arrayLabels.p.cmx \ + stdLabels.cmi +std_exit.cmo : +std_exit.p.cmx : +stream.cmo : string.cmi obj.cmi list.cmi lazy.cmi stream.cmi +stream.p.cmx : string.p.cmx obj.p.cmx list.p.cmx lazy.p.cmx stream.cmi +string.cmo : pervasives.cmi list.cmi char.cmi string.cmi +string.p.cmx : pervasives.p.cmx list.p.cmx char.p.cmx string.cmi +stringLabels.cmo : string.cmi stringLabels.cmi +stringLabels.p.cmx : string.p.cmx stringLabels.cmi +sys.cmo : sys.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 diff --git a/stdlib/random.ml b/stdlib/random.ml index 76d118746..aa47536ba 100644 --- a/stdlib/random.ml +++ b/stdlib/random.ml @@ -25,7 +25,7 @@ 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 @@ -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.[3] lsl 24) 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 for i = 0 to 54 do s.st.(i) <- i; @@ -64,7 +64,7 @@ module State = struct result ;; - let make_self_init () = make [| random_seed () |];; + let make_self_init () = make (random_seed ());; let copy s = let result = new_state () in @@ -172,7 +172,7 @@ let bool () = State.bool default;; let full_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. *) |