Arc Forumnew | comments | leaders | submitlogin
1 point by shader 5603 days ago | link | parent

Mind if I ask where the other 13/16 went? Since rand() % 10 can only output 0-10 there are only 10 possibilities, all of which are covered in your two ranges.

Either people frequently have problems with statistics as well, or random numbers are really complicated ;)



1 point by palsecam 5602 days ago | link

Well, I'm totally not an expert in "randomness assisted by computer", I just know it's something, like cryptography, where you should be careful before implementing your own solution. And I am bad in maths, and statistics/probas are so tricky (at least for me), you are right.

However, a code demonstration (in Perl, sorry, for perf/convenience):

   # We fake a bad `rand()' function by only taking 
   # values between 0 and 15.
   $cnt{rand(15) % 10} += 1 for (0..1_000_000);
   print $_, "\t", $cnt{$_}, "\n" for (sort keys %cnt);
outputs:

   0       133556
   1       133050
   2       133423
   3       132772
   4       133342
   5       66815
   6       67065
   7       66582
   8       66858
   9       66538
Are you OK with this demonstration or shall I try to find a more formal explanation/example?

-----

3 points by absz 5601 days ago | link

What you said is correct; the only problem is that with the numbers you quoted, the total probability of rolling a number in the range [0,10) is 2/16 + 1/16 = 3/16 < 1 :) The numbers you meant to quote, as borne out by your data above, are a 10/16 = 5/8 chance to get a number in the range [0,5), and a 6/16 = 3/8 chance to get a number in the range [6,10). (Equivalently, a 12/16 = 3/4 chance to get a number in the range [0,5] and a 4/16 = 1/4 chance to get a number in the range [6,9], but since that doesn't partition the [0,10) range evenly, it's less instructive.)

-----

1 point by palsecam 5601 days ago | link

Thanks for the rectification :-)

-----

2 points by palsecam 5602 days ago | link

The same thing in Arc:

   (let num->occ (table [for i 0 9 (= _.i 0)])
      (repeat 1000000  ; 1 million iterations
         (++ (num->occ (mod (rand 15) 10))))
      (each k (sort < (keys num->occ))
         (prn k "\t" (num->occ k))))
(~ same output than the Perl version)

Just for information:

   $ time perl < test-rand15.pl
   0m1.545s
   $ time mzscheme -m -f as.scm < test-rand15.arc
   0m17.374s
   $ time java -jar rainbow.jar < test-rand15.arc2 
   0m32.104s

-----