From: Stefan.Lucks@uni-weimar.de
Subject: Re: Lotto simulation
Date: Mon, 16 Jun 2014 13:15:26 +0200
Date: 2014-06-16T13:15:26+02:00 [thread overview]
Message-ID: <alpine.DEB.2.10.1406161245540.6265@debian> (raw)
In-Reply-To: <lnm7ie$4s0$1@dont-email.me>
[-- Attachment #1: Type: TEXT/PLAIN, Size: 2730 bytes --]
On Mon, 16 Jun 2014, J-P. Rosen wrote:
>> but mathematically, given a uniformly
>> distributed real number F between 0.0 and 1.0, one can get a uniformly
>> distributed discrete D between Low and high: D := Truncate(Low + F *
>> (High-Low + 1)).
> I think it all depends on the definition of "uniformly distributed". If
> it is uniformly distributed among all representable floating point
> numbers (which you get if you take an integer random number and
> unchecked-convert it to Float), you'll get many more values below 0.5
> than above (since the range 0.5..1.0 is represented with only one value
> of the exponent).
Well, do you think the Annotated Reference Manual
<http://www.ada-auth.org/standards/12aarm/html/AA-A-5-2.html> needs a
clarification? It explicitely tells
A sufficiently long sequence of random numbers obtained by successive
calls to Random is approximately uniformly distributed over the range of
the result subtype.
From my point of view, "uniformly distributed over the range of the result
subtype" would seem to imply values > 0.5 to be as often as values < 0.5.
In fact, I would claim that any random generator, choosing floats between
0.0 and 1.0 with a significant bias towards 0.0 or 1.0 would be plain
stupid and worse than useless, and a standard which allows that, would
need urgent repair!
Fortunately, my Ada compiler (gnat) is not such stupid and behaves as I
had expected:
with Ada.Text_IO, Ada.Numerics.Float_Random, Ada.Command_Line;
procedure Test_Rnd is
package ANFR renames Ada.Numerics.Float_Random;
Gen: ANFR.Generator;
High: Natural := 0;
Sample_Size: constant Natural := Natural'Value(Ada.Command_Line.Argument(1));
begin
ANFR.Reset(Gen);
for I in 1 .. Sample_Size loop
if ANFR.Random(Gen) > 0.5 then
High := High + 1;
end if;
end loop;
Ada.Text_IO.Put_Line(Integer'Image(High) &" /"& Integer'Image(Sample_Size));
end Test_Rnd;
Compiling and running the above program indicates an even distribution of
values > 0.5 and <= 0.5 (i.e., there is no statistically significant
bias):
$ ./test_rnd 100000000
49999482 / 100000000
$ ./test_rnd 1000000000
499991845 / 1000000000
Note that the results are biased towards 0.0, but the bias is
statistically insignificant. (It would be statistically strange, indeed,
if *exactly* half of the random values would be below 0.5, and the other
half would be above.)
So long
------ I love the taste of Cryptanalysis in the morning! ------
<http://www.uni-weimar.de/cms/medien/mediensicherheit/home.html>
--Stefan.Lucks (at) uni-weimar.de, Bauhaus-Universität Weimar, Germany--
next prev parent reply other threads:[~2014-06-16 11:15 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-15 17:07 Lotto simulation montgrimpulo
2014-06-15 18:54 ` Stefan.Lucks
2014-06-15 19:53 ` J-P. Rosen
2014-06-16 5:25 ` Stefan.Lucks
2014-06-16 7:49 ` J-P. Rosen
2014-06-16 11:15 ` Stefan.Lucks [this message]
2014-06-16 13:40 ` J-P. Rosen
2014-06-16 14:13 ` Natasha Kerensikova
2014-06-16 17:51 ` Randy Brukardt
2014-06-15 19:56 ` Denis McMahon
2014-06-15 20:10 ` Dirk Heinrichs
2014-06-15 20:43 ` Simon Wright
2014-06-16 20:22 ` Dirk Heinrichs
2014-06-15 20:54 ` Simon Wright
2014-06-15 22:09 ` Jeffrey Carter
2014-06-16 11:40 ` Markus Schöpflin
2014-06-16 14:25 ` Jacob Sparre Andersen
2014-06-16 12:02 ` Dmitry A. Kazakov
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox