【发布时间】:2010-11-23 07:22:21
【问题描述】:
据我所知,arc4random() 生成的随机数比rand() 好得多,但是我还没有看到播种它的方法,我想就像使用 @ 987654323@。有什么办法吗?
【问题讨论】:
-
你最后找到播种的方法了吗?
标签: ios random arc4random
据我所知,arc4random() 生成的随机数比rand() 好得多,但是我还没有看到播种它的方法,我想就像使用 @ 987654323@。有什么办法吗?
【问题讨论】:
标签: ios random arc4random
您实际上可以在 iOS 9 中做到这一点。
import GameKit
let source = GKARC4RandomSource(seed: "hello world".data(using: .utf8)!)
source.dropValues(1024)
source.nextInt() // <-- your number
根据文档:
基于 Arc4 的随机源具有可重复的初始序列。如果用于混淆,您应该从一开始就删除 N 个值,其中 N 应该是大于 768 的任何数字,以确保刷新初始序列。
因此,只要您使用相同的种子数据(显然没有在生产代码中使用 !)和相同数量的丢弃值,您就会得到相同的结果。
【讨论】:
在 Swift 3 中,当我需要种子值时,我使用 srand48() 和 drand48()。我制作的这个功能似乎可以很好地满足我的需求:
func seeded_rand(seed:Int, min:Double, max:Double) -> Int
{
srand48(seed)
return Int(round(drand48() * (max-min)) + min)
}
【讨论】:
这不是 arc4random 的设计目的。正如文档所述:
arc4random()函数提供高质量的 32 位伪随机 数字非常快。arc4random()种子本身定期来自random(4)中描述的内核强随机数子系统。
由于它无论如何都是从熵源中重新播种自己,因此手动播种不会获得任何收益,实际上,这种方法并不存在。
【讨论】:
arc4random 从中重新播种。但是,这已被弃用,您仍然无法控制播种。这基本上意味着您不能将 arc4random 视为 PRNG,当使用相同的初始化向量播种时,会产生完全相同的序列。 java.security.SecureRandom 有同样的“问题”,而且设计上也是类似的。如果您需要对 PRNG 进行细粒度控制,请实施 MT-19937,它并不长,而且 C 源代码很容易获得。
arc4random,它也无济于事,因为它会周期性地重新播种自身,因此无论如何再现性都消失了。
您实际上不需要播种...它会在第一次调用时自行播种。通过调用查看文档
man arc4random
在你的外壳中。描述下的相关行是:
There is no need to call arc4random_stir() before using arc4random(),
since arc4random() automatically initializes itself.
【讨论】:
您可以使用以下命令将字节序列作为随机性添加到 arc4random:arc4random_addrandom()
【讨论】: