I'm looking for a way to map a 31-bit positive integer (leaving some room for Java!) to another 31-bit positive integer, for purpose of random world generation, with the following properties:
-if you go through the inputs in sequence, the resulting output sequence should be a good pseudo-random sequence
-it should not require state. So a linear congruence generator or similar will not work afaik. Instead, it should be able to give you the output for any of the inputs at any time, no requirement to go through it in order.
-it should be fast, so cryptographic hashes are probably not it
-it should be stable: always give the same output for the same input (so no true random generator )
-each result is unique, that is, every possible integer is output by one input integer (not the most important requirement, but would be nice, each output value should have equal probability). So some arbitrary bit twiddling and multiplications won't do it either
I tried to implement something similar to the following one:
but it's actually not that great, I want to use a seed value as well, and while this one works great for some seeds, it does not for many as well and to make it even more annoying, it gives too similar patterns for seeds that are near each other (so if you generate for coordinates x and y a random world temperature with seed 1000 and a random height with seed 1001, they will be too correlated. Or something like that, in any case the patterns are ugly with nearby seeds).
Does anyone have suggestions for such a function?
Thanks a lot!
Edited by Lode, 13 July 2014 - 02:16 PM.