gpt4 book ai didi

ios - Swift:64 位整数的随机数?

转载 作者:IT王子 更新时间:2023-10-29 05:24:42 25 4
gpt4 key购买 nike

因此,在我当前的项目中,我需要使用 64 位整数,并且需要获取范围在 1000 亿以内的随机数。 arc4random()/arc4random_uniform() 仅适用于无符号 32 位整数。

我可能会捏造一点,因为我每次调用的最小/最大范围可能不会超过 20 亿,但我想在未来证明自己,以防万一我决定,好吧,我确实需要更广泛的范围。

有什么建议吗?

最佳答案

更新:自 Swift 4.2(随 Xcode 10.1 一起发布)在 Swift 标准库中有一个统一的随机 API,参见

你可以简单地调用

UInt64.random(in: minValue ... maxValue)

获取给定范围内的随机数。


(Swift < 4.2: 的先前答案) 使用 arc4random_buf() 您可以创建“任意大”的随机数,所以这将是一个可能的解决方案:

// Swift 2:
func random64(upper_bound: UInt64) -> UInt64 {

// Generate 64-bit random number:
var rnd : UInt64 = 0
arc4random_buf(&rnd, sizeofValue(rnd))

return rnd % upper_bound
}

// Swift 3:
func random64(upper_bound: UInt64) -> UInt64 {

// Generate 64-bit random number:
var rnd : UInt64 = 0
arc4random_buf(&rnd, MemoryLayout.size(ofValue: rnd))

return rnd % upper_bound
}

当上限不是 2 的幂时,此方法会遇到“模偏差”问题(参见 Why do people say there is modulo bias when using a random number generator? )。我在这里翻译了答案 https://stackoverflow.com/a/10989061/1187415从上面的线程到 Swift:

// Swift 2:
func random64(upper_bound: UInt64) -> UInt64 {

// Generate 64-bit random value in a range that is
// divisible by upper_bound:
let range = UInt64.max - UInt64.max % upper_bound
var rnd : UInt64 = 0
repeat {
arc4random_buf(&rnd, sizeofValue(rnd))
} while rnd >= range

return rnd % upper_bound
}

// Swift 3:
func random64(upper_bound: UInt64) -> UInt64 {

// Generate 64-bit random value in a range that is
// divisible by upper_bound:
let range = UInt64.max - UInt64.max % upper_bound
var rnd : UInt64 = 0
repeat {
arc4random_buf(&rnd, MemoryLayout.size(ofValue: rnd))
} while rnd >= range

return rnd % upper_bound
}

(乍一看好像循环不会终止,但可以显示平均需要不到 2 次迭代。)

关于ios - Swift:64 位整数的随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26549830/

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