Search code examples
algorithmrandomintegerbijection

Pseudo-random-looking one-to-one int32->int32 function


I am looking for a int32->int32 function that is

  • bijection (one-to-one correspondence)
  • cheap to calculate at least in one direction
  • transforms the increasing sequence 0, 1, 2, 3, ... into a sequence looking like a good pseudo-random sequence (~ half bits flip when argument changes by a small number, no obvious patterns)

Solution

  • Multiply by a large odd number and xor with a different one.

    Bijection: odd numbers have a multiplicative inverse modulo powers of two, so the multiplication is undone by a multiplication by the inverse. And xor is, of course, undone by another xor.

    This is basically how the linear congruence pseudo random number generator works.