gpt4 book ai didi

Swift 4.2+ 播种随机数生成器

转载 作者:可可西里 更新时间:2023-11-01 01:50:24 24 4
gpt4 key购买 nike

我正在尝试使用 Swift 4.2+ 生成种子随机数,使用 Int.random() 函数,但是没有允许随机数生成器种子的给定实现。据我所知,唯一的方法是创建一个符合 RandomNumberGenerator 协议(protocol)的新随机数生成器。有没有人推荐更好的方法,或者具有播种功能的 RandomNumberGenerator 符合类的实现,以及如何实现它?

此外,在寻找解决方案时,我曾多次看到 sranddrand 这两个函数,但从它们很少被提及的情况来看,我不确定使用它是否是错误的约定,而且我也找不到关于它们的任何文档。

我正在寻找最简单的解决方案,不一定是最安全或性能最快的解决方案(例如,使用外部库并不理想)。

更新:“播种”是指我将种子传递给随机数生成器,这样如果我将相同的种子传递给两个不同的设备或在两个不同的时间,生成器将产生相同的数字。目的是我为应用程序随机生成数据,而不是将所有数据保存到数据库中,我想保存种子并在用户每次加载应用程序时使用该种子重新生成数据。

最佳答案

所以我根据 Martin R 的建议使用 GamePlayKitGKMersenneTwisterRandomSource 来制作一个符合 RandomNumberGenerator 协议(protocol)的类,我可以使用它的一个实例像 Int.random() 这样的函数:

import GameplayKit

class SeededGenerator: RandomNumberGenerator {
let seed: UInt64
private let generator: GKMersenneTwisterRandomSource
convenience init() {
self.init(seed: 0)
}
init(seed: UInt64) {
self.seed = seed
generator = GKMersenneTwisterRandomSource(seed: seed)
}
func next<T>(upperBound: T) -> T where T : FixedWidthInteger, T : UnsignedInteger {
return T(abs(generator.nextInt(upperBound: Int(upperBound))))
}
func next<T>() -> T where T : FixedWidthInteger, T : UnsignedInteger {
return T(abs(generator.nextInt()))
}
}

用法:

// Make a random seed and store in a database
let seed = UInt64.random(in: UInt64.min ... UInt64.max)
var generator = Generator(seed: seed)
// Or if you just need the seeding ability for testing,
// var generator = Generator()
// uses a default seed of 0

let chars = ['a','b','c','d','e','f']
let randomChar = chars.randomElement(using: &generator)
let randomInt = Int.random(in: 0 ..< 1000, using: &generator)
// etc.

通过结合 GKMersenneTwisterRandomSource 的播种功能和标准库的随机函数(如 .randomElement())的简单性,这给了我所需的灵 active 和简单的实现对于数组和 .random() 对于 Int、Bool、Double 等)

关于Swift 4.2+ 播种随机数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54821659/

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