[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Gm2] Problem with urandom
From: |
Gaius Mulley |
Subject: |
Re: [Gm2] Problem with urandom |
Date: |
Fri, 11 Dec 2009 12:11:56 +0000 |
User-agent: |
Gnus/5.11 (Gnus v5.11) Emacs/22.2 (gnu/linux) |
Martin Kalbfuß <address@hidden> writes:
> Hi,
>
> I created the following module to produce random integers. But when I
> call RandInt I always get the same value. Maybe I do something wrong
> about The stream. Opening the file with fopen in C an read a value from
> it produces a random number. Do you see anything wrong here? I tried it
> with stream file, too.
>
> Thanks
>
> IMPLEMENTATION MODULE Dice;
>
> IMPORT SeqFile,
> WholeIO,
> IOChan,
> EXCEPTIONS,
> SYSTEM;
>
> VAR urandom : SeqFile.ChanId;
> res : SeqFile.OpenResults;
> source : EXCEPTIONS.ExceptionSource;
>
> PROCEDURE RandInt() : INTEGER;
> VAR result : INTEGER;
> BEGIN
> WholeIO.ReadInt(urandom, result);
> RETURN result;
> END RandInt;
>
> BEGIN
> EXCEPTIONS.AllocateSource(source);
>
> SeqFile.OpenRead(urandom, '/dev/urandom', SeqFile.raw, res);
> IF urandom = IOChan.InvalidChan() THEN
> EXCEPTIONS.RAISE(source, 0, 'Error: Could not
> access /dev/urandom');
> END;
> FINALLY
> SeqFile.Close(urandom);
> END Dice.
>
> The calling module:
> MODULE Kniffel;
>
> IMPORT Dice,
> SWholeIO,
> STextIO;
> BEGIN
> SWholeIO.WriteInt(Dice.RandInt(), 0);
> STextIO.WriteLn;
> SWholeIO.WriteInt(Dice.RandInt(), 0);
> STextIO.WriteLn;
> SWholeIO.WriteInt(Dice.RandInt(), 0);
> STextIO.WriteLn;
> END Kniffel.
>
> The results:
>
> +134653772
> +134653772
> +134653772
>
> Always the same number. All the time. No matter what I do.
Hi Martin,
I've been wanting to get to the heart of this problem for sometime
as:
od -x /dev/random
does yield a seemingly random sequence of hex bytes. I think there is
a bug in the code:
> PROCEDURE RandInt() : INTEGER;
> VAR result : INTEGER;
> BEGIN
> WholeIO.ReadInt(urandom, result);
> RETURN result;
> END RandInt;
should be:
PROCEDURE RandInt() : INTEGER;
VAR
result : INTEGER;
n : CARDINAL;
BEGIN
(* WholeIO.ReadInt(urandom, result); *)
IOChan.RawRead(urandom, SYSTEM.ADR(result), SIZE(result), n) ;
IF n#SIZE(result)
THEN
EXCEPTIONS.RAISE(source, 0, 'Error: Could not read SIZE(INTEGER)
number of bytes from /dev/urandom');
END ;
RETURN result;
END RandInt;
trying to read the raw bytes as a string is likely to hit a problem.
On my machine it gave me zero each time as the first character was
not in the range '-+012345679'. However with the modifications above
I now get:
-725512388
+517208660
+900127671
address@hidden:~/GM2/ThirdPartyTests/non-free/martin-kalbfuß$ ./a.out
+2121694642
+1452980218
-1248358007
address@hidden:~/GM2/ThirdPartyTests/non-free/martin-kalbfuß$ ./a.out
-531434612
-1484797461
+1139867131
address@hidden:~/GM2/ThirdPartyTests/non-free/martin-kalbfuß$ ./a.out
-403106276
-129135769
+1581116526
address@hidden:~/GM2/ThirdPartyTests/non-free/martin-kalbfuß$ ./a.out
-865335780
-1686289691
-526479807
address@hidden:~/GM2/ThirdPartyTests/non-free/martin-kalbfuß$ ./a.out
+82033948
-861875516
-215214017
address@hidden:~/GM2/ThirdPartyTests/non-free/martin-kalbfuß$ ./a.out
-622441135
-853786266
+472446955
regards,
Gaius
- Re: [Gm2] Problem with urandom,
Gaius Mulley <=