# Calculate Probability?

Hello,

I'm working with probability and Ruby doesn't really does as I want. Just to make it easier to understand I'll focus on the problem.

I have some event that should occur in 20% of all events. I thought I'd make it easy by just using rand like following: num = 20 - rand(100) if(num > 0)    do_stuff end

But "do_stuff" is by far not being called as often as I would like it to. Is there any method or something that is more accurate with that kind of stuff?

The code snippet seems OK to me, although the code you have in the if block will happen 80% not 20% of the time, and it could be made a bit “slimmer”.

But you say it happens less than 20%? Tried this on by Ubuntu box with Ruby 1.8.7:

irb(main):021:0> counter = 0 => 0

irb(main):022:0> 1000000.times{counter += 1 if rand(100) < 20} => 1000000

irb(main):023:0> puts String(Float(counter)/10000) + “%” 20.0002%

=> nil

So, given a million iterations, it seems to work OK, and gives the expected result of close to 20% hitrate.

But if you still have problems, then I’m at a loss… Some platform specific seeding issue perhaps? Well, hope this helps… :o)

Regards, Rolf

Quoting Heinz Strunk <lists@ruby-forum.com>:

Hello,

I'm working with probability and Ruby doesn't really does as I want. Just to make it easier to understand I'll focus on the problem.

I have some event that should occur in 20% of all events. I thought I'd make it easy by just using rand like following: num = 20 - rand(100) if(num > 0)    do_stuff end

But "do_stuff" is by far not being called as often as I would like it to. Is there any method or something that is more accurate with that kind of stuff?

The code looks correct, though a bit hard to understand. If it were my code, I might refactor it like this:

do_stuff if rand(100) < 20

I dumped the first line into irb and tried it. It looked like do_stuff wouldn't be called often enough, so I actually counted the occurrences and crunched the numbers. They were within a reasonable distance of 1 in 5. I suggest actually running the code and counting the occurrences. I suspect you'll find that 20% is less often then it seems.

HTH,   Jeffrey

Quoting Jeffrey L. Taylor <ror@abluz.dyndns.org>: [snip]

I dumped the first line into irb and tried it. It looked like do_stuff wouldn't be called often enough, so I actually counted the occurrences and crunched the numbers. They were within a reasonable distance of 1 in 5. I suggest actually running the code and counting the occurrences. I suspect you'll find that 20% is less often then it seems.

Oops, change to "less often than it seems."

Jeffrey

The Sun, 21 Mar 2010 17:12:02 +0100,

Hello,

I'm working with probability and Ruby doesn't really does as I want. Just to make it easier to understand I'll focus on the problem.

I have some event that should occur in 20% of all events. I thought I'd make it easy by just using rand like following: num = 20 - rand(100) if(num > 0)    do_stuff end

But "do_stuff" is by far not being called as often as I would like it to. Is there any method or something that is more accurate with that kind of stuff?

As said in another answer, this is convoluted code, simply testing rand(100) < 20 is ok.

To answer your original question, rand implementations don't do what most developers think they do : they are pseudo-random number generators and the randomness is not guaranteed for only one call to rand in a whole program.

If you try to get a random value only once in your program, you should feed the number generator a truly random value (for example read 4 bytes from /dev/urandom on a modern Unix box and feed them as an Integer to the generator through Kernel.srand).

Lionel

Thanks guys, I found the problem. There was another factor that made look the rand not correct. Everything's just fine now