The uuid4 implementation in Python tries to use a system-provided uuid generator if available, then os.urandom() (so-called "true" randomness), then random.randrange() (which uses a PRNG) if neither is available. In the first two cases the randomness "should" be about as random as you can ask for from your computer. In the PRNG case each random byte is generated separately, so concatenating two halves really shouldn't help.
We can empirically check how even the distribution of digits is using code like this:
import uuid
digits = [0] * 10
for i in range(100000):
x = str(uuid.uuid4().int)[-16:]
for d in x:
digits[int(d)] += 1
print(digits)
Note that I changed your code, removing >>64 because it can make the number too short and changing the slice to take the last 16 digits instead. The distribution of digits is pretty even.
[159606, 159916, 160188, 160254, 159815, 159680, 159503, 160015, 160572, 160451]
Now, let's see what changing to str(uuid.uuid4().int)[-8:] + str(uuid.uuid4().int)[-8:] does from a distribution standpoint:
[159518, 160205, 159843, 159997, 160493, 160187, 160626, 159665, 159429, 160037]
Basically nothing.
Incidentally, taking from the start of the string without the bit shift:
[151777, 184443, 184347, 166726, 151925, 152038, 152178, 152192, 151873, 152501]
There is bias toward 1s and 2s due to the 6 nonrandom bits at the beginning of the uuid4.
uuid. I wonder whystr(random.randint(0, 99999999)) + str(random.randint(0, 99999999))isn't appropriate.