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.
- 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)

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
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)

View File

@ -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;
}

View File

@ -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

View File

@ -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. *)