gpt4 book ai didi

Swift - 播种 arc4random_uniform?还是另类?

转载 作者:搜寻专家 更新时间:2023-10-31 08:10:17 29 4
gpt4 key购买 nike

让我首先说明我要完成的任务:

  1. 我需要在一定范围内随机生成一组数字
  2. 我希望这些数字稍微均匀分布
  3. 我需要能够为随机数生成播种,这样,给定一个种子,生成的随机数将始终相同。

在对 drand48()、rand() 和 arc4random() 进行了大量试验后,我目前决定使用 rand() 获取随机数,并使用 srand() 进行播种。这是一个从我正在做的事情中简化而来的小例子:

let seed: UInt32 = 10
srand(seed)
let start = 0
let end = 100
let randomNumber = Double(rand()) % (end + 1 - start) + start

这行得通。给定相同的种子,会产生相同的随机数。执行多个 randomNumber 计算会产生多个不同的随机数。通过 srand 重新播种再次开始“随机性”。

唯一的缺点是 rand() 不是均匀分布的。事实上,我几乎总是以一组在大多数情况下线性增加的数字结束。

听起来 arc4random_uniform 会生成更多统一的随机输出,但是根据我的研究,不可能为 arc4random 播种,因为它在第一次调用时自行播种,并且不一定“设计”为播种外部。

所以我的问题;有没有比 srand()/rand() 更好的替代方法,它仍然会为给定的种子提供相同的输出,但这些输出分布更均匀?

谢谢,- 亚当

最佳答案

我知道“GameKit”听起来像是只用于游戏,但它包含一个严肃的随机数生成系统。我建议你看看GKMersenneTwisterRandomSourceGKRandomDistribution . GKMersenneTwisterRandomSource 采用随机种子(如果您选择的话),GKRandomDistribution 类实现均匀分布。结合使用,它们可以完全满足您的需求。

import GameKit

// The Mersenne Twister is a very good algorithm for generating random
// numbers, plus you can give it a seed...
let rs = GKMersenneTwisterRandomSource()
rs.seed = 1780680306855649768

// Use the random source and a lowest and highest value to create a
// GKRandomDistribution object that will provide the random numbers.
let rd = GKRandomDistribution(randomSource: rs, lowestValue: 0, highestValue: 100)

// Now generate 10 numbers in the range 0...100:
for _ in 1...10 {
print(rd.nextInt())
}

print("---")

// Let's set the seed back to the starting value, and print the same 10
// random numbers.
rs.seed = 1780680306855649768
for _ in 1...10 {
print(rd.nextInt())
}

关于Swift - 播种 arc4random_uniform?还是另类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38679670/

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