Newbie questions about Pliant

Newbie questions about Pliant

randomness

Not getting uniformely distributed random numbers.
Message posted by maybe Boris Reitman on 2005/12/09 19:45:30
Here is the code,

----------8<--------------
module "/pliant/util/crypto/intn.pli"
constant random_resolution 1000000
function random_f -> r
  arg Float r
  r := 1.0/(cast random:random_resolution Float)

function do_stuff num_repeats
  arg Int num_repeats
  var Int count := 0
  for (var Int x) 1 num_repeats
    var Float r := random_f
    if r > 0.5
      count += 1
  console "Got greater than 1/2: " count " out of " num_repeats " repeats " eol
  var Float prob := (cast count Float)/(cast num_repeats Float)
  console "Prob greater than 1/2: " string:prob eol

do_stuff 100000
---------->8------------------------

The run,

----------------8<------------------
Got greater than 1/2: 0 out of 100000 repeats 
Prob greater than 1/2: 0
--------------->8-------------------
Message posted by hubert.tonneau on 2005/12/09 22:46:00
random 1000000
return a random number between 0 and 999999,
so in you code, we have r>=0.5 only if the value returned by random call was
1 or 2.
The probability of it is roughly 2/1000000,
so if you run it 100000, then in 8/10 runs, get 0 success.

Also, what appends when random call returns zero is undefined because then
your r variable is undefined as a result of a zero divided by zero.
Message posted by maybe Boris Reitman on 2005/12/10 11:31:38
Thanks, my bad.