最快的随机数生成器

安迪

我打算通过Swift 3实现一个随机数生成器。我有三种不同的方法可以不间断地生成一个整数(在0之间50000)一万次。

这些生成器是否使用生成值的相同数学原理?

哪个生成器在运行时(具有10000次迭代)消耗的CPU和RAM较少?

方法A

var generator: Int = random() % 50000

方法B

let generator = Int(arc4random_uniform(50000))

方法C

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

好吧,首先,这是模偏置的,因此它肯定不会等同于适当的统一随机数。用于random解释它的文档

random()函数使用非线性的加性反馈随机数生成器,并采用大小为31个长整数的默认表。它返回从0到(2 ** 31)-1范围内的连续伪随机数。该随机数生成器的周期非常大,大约为16 *((2 ** 31)-1)。

但是您可以在Apple的libc源代码中查看完整的实现和文档

对比以下文档arc4random_uniform(没有模偏差):

这些函数使用密码伪随机数生成器非常快速地生成高质量的随机字节。一个数据池用于一个过程中的所有使用者,因此程序流下的消耗可充当额外的搅动。该子系统定期从内核随机数子系统中重新播种,也可以在fork(2)上重新播种。

并且源代码也可用。需要注意的重要一点arc4random_uniform是,它可以通过正确地调整模数然后生成随机数直到其在正确的范围内来避免模数偏差。原则上,这可能需要生成无限数量的随机值;实际上,它很少需要生成一个以上的东西,这种情况很少见,而且令人难以置信的是,它会产生更多的东西。

GKRandomSource.sharedRandom() 也有据可查:

系统随机源与C函数的arc4random系列共享状态。使用此源生成随机数会修改对这些函数的将来调用的结果,而调用这些函数会修改此源所生成的随机值的序列。因此,该来源既不是确定性的也不是独立的,仅用于不依赖那些属性的琐碎游戏玩法。

为了提高性能,您会期望random()它是最快的,因为它永远不会从系统熵池中植入种子,因此它也不会降低系统中的熵(尽管这arc4random只是定期进行,我相信大约每1.5MB左右的随机字节生成;并非针对每个值)。但是,与所有性能一样,您必须进行概要分析。当然,由于random()不重新设置种子本身,因此它的随机性小于arc4random,而其自身的随机性也小于系统中的熵源(/dev/random)。

如有疑问,请使用GameplayKit。苹果公司sharedRandom()根据他们认为在大多数情况下效果最佳的情况来选择实施否则使用arc4random但是,如果您真的需要最大程度地减少“相当好”(但不是密码)随机数对系统的影响,请参阅random如果您愿意采用“如果您不太仔细看就可以随机获取”的数字,并且对系统的影响甚至更低,请查看rand而且,如果您希望对系统几乎没有影响(保证为O(1),可内联),请参见XKCD的getRandomNumber()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

设计随机数生成器

来自分类Dev

C ++随机数生成器

来自分类Dev

随机数生成器android

来自分类Dev

JavaScript随机数生成器

来自分类Dev

随机数生成器-停止

来自分类Dev

用随机数生成器播种随机数生成器池

来自分类Dev

播种多个随机数生成器

来自分类Dev

fortran中的随机数生成器

来自分类Dev

打包(类型擦除)随机数生成器

来自分类Dev

我应该播种随机数生成器吗?

来自分类Dev

Haskell中的伪随机数生成器

来自分类Dev

在Clojure中重新绑定随机数生成器

来自分类Dev

R中的并行随机数生成器

来自分类Dev

Array#sample随机数生成器

来自分类Dev

如何定义全局随机数生成器?

来自分类Dev

NaN附带了Javascript随机数生成器

来自分类Dev

非常简单的随机数生成器编译问题

来自分类Dev

Memento在伪随机数生成器中的用法

来自分类Dev

Sprite Kit中的种子随机数生成器

来自分类Dev

C ++快速正常随机数生成器

来自分类Dev

C / C ++中随机数生成器的实现

来自分类Dev

快速均匀分布随机数生成器

来自分类Dev

Javascript随机数生成器到隐藏字段

来自分类Dev

随机数生成器过于重复某些数字

来自分类Dev

Excel VBA强大的随机数生成器

来自分类Dev

偶数和奇数的随机数生成器

来自分类Dev

C(++)中的Stata随机数生成器

来自分类Dev

numpy中的随机数生成器

来自分类Dev

C:srand不影响随机数生成器