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?
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.
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.
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).