从我可以收集的内容来看,arc4random()
生成的随机数比生成的随机数要好得多rand()
,但是我还没有看到一种方法来播种它,我只想使用srand()
. 有办法吗?
问问题
9514 次
5 回答
23
这不是 arc4random 的设计目的。正如文档所述:
该
arc4random()
函数非常快速地提供高质量的 32 位伪随机数。arc4random()
定期从random(4)
.
由于无论如何它都是从熵源重新播种,因此手动播种不会获得任何收益,实际上,这种方法不存在。
于 2010-11-24T14:04:52.977 回答
8
您实际上可以在 iOS 9 中执行此操作。
import GameKit
let source = GKARC4RandomSource(seed: "hello world".data(using: .utf8)!)
source.dropValues(1024)
source.nextInt() // <-- your number
根据文档:
基于 Arc4 的随机源具有可重复的初始序列。如果用于混淆,您应该从一开始就删除 N 个值,其中 N 应该是大于 768 的任何数字,以确保刷新初始序列。
因此,只要您使用相同的种子数据(显然没有!
在生产代码中使用)和相同数量的丢弃值,您就会得到相同的结果。
于 2016-08-29T02:17:14.357 回答
6
在 Swift 3 中,我正在使用srand48()
并且drand48()
当我需要种子值时。我制作的这个功能似乎可以很好地满足我的需求:
func seeded_rand(seed:Int, min:Double, max:Double) -> Int
{
srand48(seed)
return Int(round(drand48() * (max-min)) + min)
}
于 2017-07-18T13:26:06.643 回答
1
您可以使用以下命令将字节序列作为随机性添加到 arc4random:arc4random_addrandom()
于 2011-03-14T21:53:04.040 回答
-1
您实际上并不需要播种...它会在第一次调用时自行播种。通过调用查看文档
man arc4random
在你的壳里。描述下的相关行是:
There is no need to call arc4random_stir() before using arc4random(),
since arc4random() automatically initializes itself.
于 2010-11-23T07:23:52.937 回答