Ada*_*eld 5 random swift uniform-distribution
首先让我说明我要完成的任务:
在使用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
Run Code Online (Sandbox Code Playgroud)
这有效.给定相同的种子,出现相同的随机数.执行多个randomNumber计算会产生多个不同的随机数.通过srand重新播种再次启动"随机性".
唯一的缺点是rand()不是均匀分布的.事实上,我总是最终得到一组数字,这些数字在大多数情况下线性增加.
听起来像arc4random_uniform会产生更多的均匀随机输出,但是根据我的研究,不可能为arc4random播种,因为它在第一次调用时会自行播种,并且不一定"设计"为外部播种.
所以我的问题; 是否有一个更好的srand()/ rand()替代方案仍然可以为给定的种子提供相同的输出,但这些输出更均匀分布?
谢谢, - 亚当
vac*_*ama 16
我知道"GameKit"听起来只是为了游戏,但它包含一个严重的随机数生成系统.我建议你看看GKMersenneTwisterRandomSource和GKRandomDistribution.将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())
}
Run Code Online (Sandbox Code Playgroud)