Recently tested a bit-rotation method of coordinate generation. It helps to eliminate position-significance bias from binary word by shifting all bits in it and adding one new bit from RNG on every iteration so every bit is used in every position. It also decreases entropy consumption, since 10 bits of entropy are producing 10 random numbers.
The only problem i found is autocorrelation between x and y coordinates, but it can be easily solved if you generate all values for x axis, and then all digits for y separately. This way points distribution look uniform.
Code on C# for RN generation
public int rotstack = -1;
public override int Next(int maxValue)
{
//improved method which tries to prevent modulo bias
{
//how many bits do we need to store maxValue?
int reqBits = Convert.ToInt32(Math.Ceiling(Math.Log(maxValue, 2)));
int randMax = Convert.ToInt32(Math.Pow(2, reqBits));
while (true)
{
int n = maxValue;
if (rotstack > -1)
{ rotstack = BitRot(rotstack, 1, reqBits);}
else
{ rotstack = BitRot(0, reqBits, reqBits); }
if (!(rotstack >= (randMax - n) && rotstack >= n))
{
return rotstack % n;
}
}
}
}
public int BitRot(int val, int rotations, int reqBits)
{
int msb = reqBits - 1;
for (int i=0; i<rotations; i++)
{
val = val >> 1;
if (GetRandomBit()) { val = val |= (1 << msb); }
}
return val;
}