在iOS中播种arc4random()

and*_*ewz 22 random arc4random ios

从我可以收集到的内容arc4random()产生的数据要好得多rand(),但是我没有看到种植它的方法,我想只是喜欢使用srand().有办法吗?

Joe*_*oey 22

这不是arc4random的设计目标.正如文件所述:

arc4random()功能可以非常快速地提供高质量的32位伪随机数.arc4random()种子本身定期从内核强随机数子系统中描述random(4).

因为无论如何它都是从熵源重新种子本身,你手动播种它什么也得不到,事实上,这种方法并不存在.

  • 实际上,手动播种随机数生成器可以获得一些东西.当与程序生成的资源结合使用时,它提供了一种仅用其识别种子号多次再现相同资源的方法.这允许与其他用户共享复杂的随机构造,但不需要大数据文件传输.当然,这假设您的伪随机生成器始终为同一种子生成相同的序列. (5认同)
  • @andrews:你唯一能做的就是手动将东西插入到熵池中,`arc4random`将从中重新插入.但是,这已被弃用,您仍然无法控制播种.这基本上意味着您不能将`arc4random`视为PRNG,当使用相同的初始化向量播种时,它会生成完全相同的序列.`java.security.SecureRandom`具有相同的"问题",它的设计类似.如果您需要对您的PRNG进行细粒度控制,那么实施MT-19937,它不会很长,并且C源代码随时可用. (4认同)

Sam*_*fes 7

你可以在iOS 9中实现这一点.

import GameKit

let source = GKARC4RandomSource(seed: "hello world".data(using: .utf8)!)
source.dropValues(1024)
source.nextInt() // <-- your number
Run Code Online (Sandbox Code Playgroud)

根据文件:

基于Arc4的随机源具有可重复的初始序列.如果用于混淆,则应从开头删除N值,其中N应为大于768的任何数字,以确保刷新初始序列.

因此,只要您使用相同的种子数据(显然不使用!生产代码)和相同数量的删除值,您将获得相同的结果.


Wex*_*Wex 6

在Swift 3中,我在使用srand48()并且drand48()需要种子值时。我做了这个功能,似乎可以很好地满足我的需求:

func seeded_rand(seed:Int, min:Double, max:Double) -> Int
{
    srand48(seed)
    return Int(round(drand48() * (max-min)) + min)
}
Run Code Online (Sandbox Code Playgroud)