Реализация PRNG xoshiro256 + в Swift для RN ​​в заданном диапазоне? - PullRequest
0 голосов
/ 28 мая 2018

На основании источника, написанного на 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? Я на самом деле потерян в этот момент.

1 Ответ

0 голосов
/ 28 мая 2018

XOR не может переполниться, поэтому ваша проблема с дополнением.Измените let result_plus = s[0] + s[3] на let result_plus = s[0] &+ s[3] (обратите внимание на '&'), чтобы сообщить Swift, что вы хотите обрезать дополнение при переполнении.Вы можете прочитать раздел «Операторы переполнения» в книге Apple «Язык программирования Swift» для более подробной информации.

Чтобы преобразовать в Double, используйте:

Double(next() >> 12) / 0x10000000000000

A Doubleимеет 52 бита мантиссы, а шестнадцатеричное значение равно 2 ** 52.При этом используются верхние 52 бита вашего UInt64 для получения результата в диапазоне [0,1,0) с наивысшей достижимой точностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...