You can use Hilbert's space filling curve, however this still uses binary representation albeit in disguise.
Here is a Wiki link for Hilbert Curve's definition: https://en.m.wikipedia.org/wiki/Hilbert_curve
Hilbert curve, in essence, is a mapping of a 1D line segment to a 2D square plane and vice versa. One of its properties is that it preserves locality which might be helpful for you.
I had tried creating one myself and I learned that it is just a binary manipulation, and instead of separating the bits with odd and even index, it is clumping them into small groups with very small Hamming distance between them.
Having a decimal solution for this problem is not efficient information-wise. Converting it into binary and separating it, is the easiest solution. If you want locality, then use the Hilbert Space Filling Curve or any other space filling curves. Any decimal solution will have information loss greater than a good binary solution. This is evident from the radix economy between base 2 and 10.
It is also easy to convert a uniform random variable into binary.
def Bin(n, v):
b = []
for i in range(v):
if n > 0.5:
b.append(1)
n = 2*n-1
else:
b.append(0)
n = 2*n
return b
def BinInv(b, v):
n = 0
for i in range(v):
n += 2*(-i-1)b[i]
return n
v is the size of the binary number, n is the decimal number, and b is a binary number represented as a list.