На основании источника, написанного на c: здесь .
Я пытаюсь реализовать генератор псевдослучайных чисел (PRNG) xoshiro256 + в Swift.Мне нужно добраться до точки, где алгоритм дает мне число от 0 до 1, которое я затем могу умножить на счет данного диапазона и затем сдвинуть на первое число в этом диапазоне.
Пока что я переписал то, что перечислено в источнике здесь:
func rotl(_ x: UInt64, _ k: Int) -> UInt64 {
return (x << k) | (x >> (64 - k))
} // This is the rotating function.
var s: [UInt64] = [1,2,3,4] // I gave a seed vector of the basic 1234.
func next() -> UInt64 {
let result_plus = s[0] + s[3]
let t = s[1] << 17
s[2] ^= s[0]
s[3] ^= s[1]
s[1] ^= s[2]
s[0] ^= s[3]
s[2] ^= t
s[3] = rotl(s[3], 45)
return result_plus
} // This returns the next number in the algorithm while XORing the seed vectors for use in the next call.
Но после вызова функции "next" 6 раз я получаю сообщение об ошибке, которое, как я предполагаю, связано с превышениемМаксимальный предел UInt64. Это всего лишь предположение.
Как мне поступить, чтобы добиться того, чего я добиваюсь с этого момента?Я предполагаю, что мне нужно отбросить младшие биты, чтобы иметь возможность продолжать вызывать «следующую» функцию, не превышая UInt64, и оттуда мне нужно как-то преобразовать в double? Я на самом деле потерян в этот момент.