[m-users.] Random Number Generator
Volker Wysk
post at volker-wysk.de
Sun Jul 30 21:17:31 AEST 2023
Hi
I find the documentation of the random* modules a litte confusing. I got
this far (this works):
main(!IO) :-
open_system_rng(MaybeHandle, !IO),
(
MaybeHandle = maybe.ok(Handle),
random.system_rng.generate_uint64(Handle, First, !IO),
random.system_rng.generate_uint64(Handle, Second, !IO),
random.system_rng.generate_uint64(Handle, Third, !IO),
random.sfc64.seed(First, Second, Third, P, State),
make_io_urandom(P, State, M, !IO),
generate_uint64(M, R, !IO),
io.format("R=%s\n", [s(string.string(R))], !IO)
;
MaybeHandle = maybe.error(Msg),
io.format("Error opening system random number generator:\n%s\n",
[s(Msg)], !IO)
).
I don't like the argument M of make_io_random/5 and generate_uint64/4, which
needs to be passed around when using the random number generator. The RNG is
attached to the IO state only half-way, the M arument still needs to be
passed around. I'd like to have some predicate "generate_uint64(uint64::out,
io::di, io::uo)", which doesn't need the M argument, because all is stored
in the IO state.
Actually, that M argument is of type params and this is a dummy type (from
the source code of random.sfc64):
:- type params
---> params.
It's the same for random.sfc32, but not for random.sfc16. And the module
random.sfc64 defines this:
:- pred generate_uint64(uint64::out, ustate::di, ustate::uo) is det.
That's looks like what I need, but there isn't such a member of the urandom
type class, which I need to use when I want it to be attached to the IO
state.
I hope I've made sense.
Cheers,
Volker
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: This is a digitally signed message part
URL: <http://lists.mercurylang.org/archives/users/attachments/20230730/2e8844f5/attachment.sig>
More information about the users
mailing list