I'm making a game in C++ and it involves filling tiles with random booleans (either yes or no) whether it is yes or no is decided by rand() % 1
. It doesn't feel very random.
I'm using srand
with ctime
at startup, but it seems like the same patterns are coming up.
Are there any algorithms that will create very random numbers? Or any suggestions on how I could improve rand()
?
People say lower-order bits are not random. So try something from the middle. This will get you the 28th bit:
The perfect way of Yes or No as random is toggling those. You may not need random function.
The lowest bits of standard random number generators aren't very random, this is a well known problem.
I'd look into the boost random number library.
A quick thing that might make your numbers feel a bit more random would be to re-seed the generator each time the condition
if(rand() % 50==0)
is true.The easiest thing you can do, short of writing another PRNG or using a library, would be to just use all bits that a single call to
rand()
gives you. Most random number generators can be broken down to a stream of bits which has certain randomness and statistical properties. Individual bits, spaced evenly on that stream, need not have the same properties. Essentially you're throwing away between 14 and 31 bits of pseudo-randomness here.You can just cache the number generated by a call to
rand()
and use each bit of it (depending on the number of bitsrand()
gives you, of course, which will depend onRAND_MAX
). So if yourRAND_MAX
is 32768 you can use the lowest-order 15 bits of that number in sequence. Especially ifRAND_MAX
is that small you are not dealing with the low-order bits of the generator, so taking bits from the high end doesn't gain you much. For example the Microsoft CRT generates random numbers with the equationand then shifts away the lowest-order 16 bits of that result and restricts it to 15 bits. So no low-order bits from the generator there. This largely holds true for generators where
RAND_MAX
is as high as 231 but you can't count on that sometimes (so maybe restrict yourself to 16 or 24 bits there, taken from the high-order end).So, generally, just cache the result of a call to
rand()
and use the bits of that number in sequence for your application, instead ofrand() % 2
.With random numbers to get good results you really need to have a generator that combines several generators's results. Just discarding the bottom bit is a pretty silly answer.
multiply with carry is simple to implement and has good results on its own and if you have several of them and combine the results you will get extremely good results. It also doesn't require much memory and is very fast.