Macos 最快的随机数发生器

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()函数使

我打算通过Swift 3实现一个随机数生成器。我有三种不同的方法来生成一个整数(介于
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