Cześć. Interesuje mnie zaprogramowanie generatora liczb losowych PCG o nazwie XSL-RR-RR:
https://en.wikipedia.org/wiki/Permuted_congruential_generator
Napisałem kod, który działa (i z tego co testowałem działa poprawnie):
def PCG(x):
count1 = x >> 122
x1 = (x ^ (x >> 64)) % (1 << 64)
low64 = (((1 << (64 - count1)) * ((x1 % (1 << count1)) + (1 << count1))) ^ (1 << 64)) + (x1 >> count1)
x2 = (x >> 64) % (1 << 64)
count2 = low64 & 63
high64 = (((1 << (64 - count2)) * ((x2 % (1 << count2)) + (1 << count2))) ^ (1 << 64)) + (x2 >> count2)
x = (high64 << 64) | low64
return x
Funkcja przyjmuje wynik obliczony w LCG, na przykład wynik działania x = x*12345 + 1234567 mod 2^128 i wykonuje odpowiednie kroki.
Chcę jednak wiedzieć, czy da się to zaprogramować w Pythonie szybciej? Przykładowo, żeby uciąć liczby do najbardziej znaczących 64 bitów muszę liczyć x1, gdzie używam modulo (1 << 64). Żeby obrócić bity rotr64, musiałem również napisać własną funkcję, która to robi. Czy można to rotr zrobić w Pythonie jakoś szybciej? Szukałem tego typu funkcji w numpy, ale nie znalazłem.