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?

Thanks in advance!

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 S. [email protected]:

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

The S., 21 Mar 2010 17:12:02 +0100,
Heinz S. [email protected] wrote:

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 :slight_smile:

Quoting Jeffrey L. Taylor [email protected]:
[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

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs