Macos 最快的随机数发生器
我打算通过Swift 3实现一个随机数生成器。我有三种不同的方法来生成一个整数(介于Macos 最快的随机数发生器,macos,random,swift3,generator,Macos,Random,Swift3,Generator,我打算通过Swift 3实现一个随机数生成器。我有三种不同的方法来生成一个整数(介于0和50000之间),可以不间断地生成一万次 这些生成器是否使用生成值的相同数学原理 哪个生成器在运行时CPU和RAM密集度较低(有10000次迭代) 方法A: 方法B: 方法C: 所有这些都有很好的文档记录,并且大多数都发布了源代码 var generator: Int = random() % 50000 首先,这是,所以它肯定不会等价于一个适当的均匀随机数。random的文档解释: random()函数使
0
和50000
之间),可以不间断地生成一万次
这些生成器是否使用生成值的相同数学原理
哪个生成器在运行时CPU和RAM密集度较低(有10000次迭代)
方法A:
方法B:
方法C:
所有这些都有很好的文档记录,并且大多数都发布了源代码
var generator: Int = random() % 50000
首先,这是,所以它肯定不会等价于一个适当的均匀随机数。random
的文档解释:
random()函数使用一个非线性、加性反馈、随机数生成器,使用大小为31个长整数的默认表。它返回范围内连续的伪随机数
从0到(2**31)-1。这个随机数发生器的周期非常大,大约为16*((2**31)-1)
但是你可以在苹果的网站上看到完整的实现和文档
对比arc4random_uniform
(没有模偏差)的文档:
这些函数使用加密伪随机数生成器快速生成高质量的随机字节。一个数据池用于流程中的所有使用者,因此
在程序下,流动可作为额外的搅拌。该子系统定期从内核随机数子系统重新播种,也在fork(2)上
此外,还提供了。从arc4random_uniform
中需要注意的重要一点是,它通过正确调整模,然后生成随机数,直到其位于正确的范围内,从而避免模偏差。原则上,这可能需要生成无限数量的随机值;在实践中,它需要产生不止一个的情况是非常罕见的,而且很少会产生不止一个的情况
gkramonSource.SharedAndom()
也有很好的文档记录:
系统随机源与arc4random C函数族共享状态。使用此源生成随机数会修改将来调用这些函数的结果,而调用这些函数会修改此源生成的随机值序列。因此,此源既不是确定性的,也不是独立的。仅将其用于不依赖于这些属性的琐碎游戏机制
对于性能,您希望random()
速度最快,因为它从不从系统熵池中播种自身,因此它也不会减少系统中的熵(尽管arc4random
只是周期性地减少熵,我相信大约每生成1.5MB左右的随机字节;不是每个值都会减少熵)。但与所有性能方面一样,您必须配置文件。当然,由于random()
没有对自身重新设定种子,因此它的随机性低于arc4random
,而arc4random本身的随机性低于系统中的熵源(/dev/random
)
如果您有疑问,请使用GameplayKit。苹果选择了
sharedRandom()
的实现,这是基于他们认为在大多数情况下最有效的方式。否则使用arc4random
。但是,如果您确实需要将“非常好”(但不是加密)随机数对系统的影响降至最低,请查看random
。如果你愿意接受“如果你看得不太仔细,就有点随机”的数字,并且对系统的影响更小,请查看rand
。如果您希望对系统几乎没有影响(保证O(1),可内联),请参阅。所有这些都有很好的文档记录,并且大多数都发布了源代码
var generator: Int = random() % 50000
首先,这是,所以它肯定不会等价于一个适当的均匀随机数。random
的文档解释:
random()函数使用一个非线性、加性反馈、随机数生成器,使用大小为31个长整数的默认表。它返回范围内连续的伪随机数
从0到(2**31)-1。这个随机数发生器的周期非常大,大约为16*((2**31)-1)
但是你可以在苹果的网站上看到完整的实现和文档
对比arc4random_uniform
(没有模偏差)的文档:
这些函数使用加密伪随机数生成器快速生成高质量的随机字节。一个数据池用于流程中的所有使用者,因此
在程序下,流动可作为额外的搅拌。该子系统定期从内核随机数子系统重新播种,也在fork(2)上
此外,还提供了。从arc4random_uniform
中需要注意的重要一点是,它通过正确调整模,然后生成随机数,直到其位于正确的范围内,从而避免模偏差。原则上,这可能需要生成无限数量的随机值;在实践中,它需要产生不止一个的情况是非常罕见的,而且很少会产生不止一个的情况
gkramonSource.SharedAndom()
也有很好的文档记录:
系统随机源与arc4random C函数族共享状态。使用此源生成随机数会修改将来调用这些函数的结果,而调用这些函数会修改此源生成的随机值序列。因此,此源既不是确定性的,也不是独立的。仅将其用于不依赖于这些属性的琐碎游戏机制
对于性能,您可能希望random()
是最快的,因为它没有
import GameKit
let number: [Int] = [0, 1, 2... 50000]
func generator() -> Int {
let random = GKRandomSource.sharedRandom().nextIntWithUpperBound(number.count)
return number[random]
}
var generator: Int = random() % 50000
func xorshift128plus(seed0 : UInt64, seed1 : UInt64) -> () -> UInt64 {
var s0 = seed0
var s1 = seed1
if s0 == 0 && s1 == 0 {
s1 = 1 // The state must be seeded so that it is not everywhere zero.
}
return {
var x = s0
let y = s1
s0 = y
x ^= x << 23
x ^= x >> 17
x ^= y
x ^= y >> 26
s1 = x
return s0 &+ s1
}
}
// create random generator, seed as needed!!
let random = xorshift128plus(seed0: 0, seed1: 0)
for _ in 0..<100 {
// and use it later
random()
}
func random_uniform(bound: UInt64)->UInt64 {
var u: UInt64 = 0
let b: UInt64 = (u &- bound) % bound
repeat {
u = random()
} while u < b
return u % bound
}
let r_number = random_uniform(bound: 5000) // r_number from interval 0..<5000