gpt4 book ai didi

swift - 使用 GameplayKit 生成随机数

转载 作者:行者123 更新时间:2023-11-28 12:52:20 28 4
gpt4 key购买 nike

我正在学习使用 swift 和 Gameplaykit 生成随机数。在下面的代码中,数字是在我初始化 randomDist 时生成的,它只是在我调用 nextInt 时从已经生成的数字中提供样本,还是在我调用 nextInt() 时随机生成器是延迟生成的?

let rand = GKMersenneTwisterRandomSource()          // the generator can be specified
let randomDist = GKRandomDistribution(randomSource: rand, lowestValue: 50, highestValue: 100)
randomDist.nextInt()

最佳答案

请记住,GKRandomDistribution 可以利用任何底层随机化器——也就是说,不仅是任何 GameplayKit GKRandomSource 类,还可以是任何实现 GKRandom< 的类 协议(protocol)。因此,您可以通过实现自己的随机源并查看如何/何时调用其方法来自己回答这个问题。

class LoggingRandomSource: GKRandom {
let source = GKARC4RandomSource()
@objc func nextInt() -> Int {
let num = source.nextInt()
print("nextInt: \(num)")
return num
}
@objc func nextIntWithUpperBound(upperBound: Int) -> Int {
let num = source.nextIntWithUpperBound(upperBound)
print("nextIntWithUpperBound: \(num)")
return num
}
@objc func nextUniform() -> Float {
let num = source.nextUniform()
print("nextUniform: \(num)")
return num
}
@objc func nextBool() -> Bool {
let flip = source.nextBool()
print("nextBool: \(flip)")
return flip
}
}

let rand = LoggingRandomSource()
let randomDist = GKRandomDistribution(randomSource: rand, lowestValue: 50, highestValue: 100)
randomDist.nextInt()

继续探索这个技巧,您会注意到一些关于随机分布类的事情:

  • GKRandomDistribution 每次调用其方法之一时,都会对底层随机源调用一次 nextIntWithUpperBound。这是有道理的,因为底层源的 nextIntWithUpperBound 被假定为统一的,所以 GKRandomDistribution 需要做的就是将该统一的 int 映射到它的 lowestValue-highestValue 范围。

  • GKGaussianDistribution 对底层 nextUniform 进行两次调用,每次调用其中一个方法。这是因为有很多方法可以在给定两个均匀随机值的情况下生成高斯(也称为正态)随机值 — 请参阅 Box-Muller transform .

  • GKShuffledDistribution 在您第一次向它询问数字时对底层 nextIntWithUpperBound 进行一系列调用,但如果没有它,您可以向它询问更多再次调用底层资源。这符合该分布记录的行为:它确保在再次重复相同值之前用尽其范围内的所有可能值。一种简单的方法是获取所有这些值,打乱它们的顺序,然后在每次调用时从打乱后的池中提取一个值,直到它清空。

关于swift - 使用 GameplayKit 生成随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36114998/

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