http://www.perlmonks.org?node_id=11126204


in reply to is rand random enough to simulate dice rolls?

But I dont wont to do a cryptographically secure application.

I just want to be sure that if I use rand to simulate a six sided die and I repaet the roll 10000 times I will get an average result of 3.5 as expected.

If that's the case, why bother? If the result is other than expected, just output that, a short remark about why this is bad, and let users of specific platforms scratch their own head :P

perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'
  • Comment on Re: is rand random enough to simulate dice rolls?

Replies are listed 'Best First'.
Re^2: is rand random enough to simulate dice rolls?
by Discipulus (Abbot) on Jan 03, 2021 at 17:03 UTC
    thanks shmem and all

    In effect this sounds the wiser thing to do. I have modified my .t file to just emit a warning via diag

    my $tenk; $tenk += 1 + int( rand(6) ) for 1..10000; my $avg = $tenk/10000; # $avg = 5; # uncomment this line to provoke the warning if ( ($avg < 3.4) or ($avg > 3.6) ){ diag("\n\n\nPROBLEM: you got an average of $avg while was expected + a value > 3.4 and < 3.6\n\n\n". "The average was made on 10000 results.\n". "This can happen in old Perl distribution on some platform +.\n". "In future distributions of this module you might be able +to load a different random number generator\n\n\n\n") } else{ ok ( $avg > 3.4, "average randomness ok (10000d6 / 10000 > 3.4)" ) +; ok ( $avg < 3.6, "average randomness ok (10000d6 / 10000 < 3.6)" ) +; }

    L*

    UPDATE nothing critical nor crucial: I'm just started a little project just to clean my rusty hands: it was a long time (for me) without coding :)

    There are no rules, there are no thumbs..
    Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.

      Note that you don't really need the two ok's in the else since the conditions have already been tested, and in fact they may fail in case $avg==3.4 or $avg==3.6. You could just do else { pass "average randomness ok (3.4 < 10000d6 / 10000 < 3.6)" } instead.

        yes :) I was tempted to put there a  ok ( 1, "average randomness ok.. but seemed stupid. I forgot the pass option. Thanks

        L*

        There are no rules, there are no thumbs..
        Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.