gpt4 book ai didi

swift - 在 Swift 中为给定范围内的 RN 实现 PRNG xoshiro256+?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:10:12 25 4
gpt4 key购买 nike

基于用 c 编写的源代码:here .

我正在尝试在 Swift 中实现 xoshiro256+ 伪随机数生成器 (PRNG)。我需要达到算法给我一个介于 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.

但是在调用“下一个”函数 6 次之后,我得到一个错误,我猜这是因为超过了 UInt64 的最大限制。 这只是一个猜测。

从现在开始,我将如何继续实现我所追求的目标?我猜我需要丢弃较低的位才能继续调用“下一个”函数而不超过 UInt64 并且从那里我需要以某种方式转换为 double ? 此时我真的迷路了。

最佳答案

XOR 不能溢出,所以你的问题是加法。将 let result_plus = s[0] + s[3] 更改为 let result_plus = s[0] &+ s[3](注意“&”) Swift 你希望添加在溢出时截断。您可以阅读 Apple 的书“The Swift Programming Language”中关于“Overflow Operators”的部分以了解更多详细信息。

要转换为 Double 使用:

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

Double 有 52 个尾数位,十六进制值为 2**52。这使用您的 UInt64 的高 52 位来产生 [0,1.0) 范围内具有最高可实现精度的结果。

关于swift - 在 Swift 中为给定范围内的 RN 实现 PRNG xoshiro256+?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50559229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com