[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