% ---------------------------------------------------------------------------- %
% random.m
% Ralph Becket <rbeck@microsoft.com>
% Tue Jan  9 14:18:19 GMT 2001
% vim: ts=4 sw=4 et tw=0 wm=0 ff=unix
% ---------------------------------------------------------------------------- %

:- module mytest.

:- interface.

:- import_module io.



:- pred main(io__state, io__state).
:- mode main(di, uo) is det.



:- implementation.



:- import_module float, int, list, string, require.


main -->
    io__command_line_arguments(ArgV),
    (   { ArgV = [],        N = 1 }
    ;   { ArgV = [Arg],     N = string__det_to_int(Arg) }
    ;   { ArgV = [_,_|_],   error("usage: random [N]") }
    ),
    io__format("%.9f\n", [f(nth_random_no(N, seed))]).


:- func nth_random_no(int, int) = float.

nth_random_no(I, S0) = ( if I > 1 then nth_random_no(I - 1, S) else R ) :-
    gen_random(100.0, R, S0, S).



:- pred gen_random(float, float, int, int).
:- mode gen_random(in, out, in, out) is det.

gen_random(Max, R, S0, S) :-
    S = (S0 * ia + ic) `rem` im,
    R = Max * float(S) / float(im).

:- func im = int.   im = 139968.
:- func ia = int.   ia =   3877.
:- func ic = int.   ic =  29573.
:- func seed = int. seed =   42.