25

从我可以收集的内容来看,arc4random()生成的随机数比生成的随机数要好得多rand(),但是我还没有看到一种方法来播种它,只想使用srand(). 有办法吗?

4

5 回答 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()

http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/arc4random.3.html

于 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 回答