当前位置: 首页 > 面试题库 >

Swift-播种arc4random_uniform?还是另类?

魏朗
2023-03-14
问题内容

让我首先说明我要完成的工作:

  1. 我需要随机生成一个范围内的一组数字
  2. 我希望这些数字可以均匀分布
  3. 我需要能够为随机数生成提供种子,以便在获得种子的情况下,所得的随机数将始终相同。

在对drand48(),rand()和arc4random()进行了大量实验之后,我目前决定使用rand()获得随机数,并使用srand()进行播种。这是从我正在做的事情简化的一个小例子:

let seed: UInt32 = 10
srand(seed)
let start = 0
let end = 100
let randomNumber = Double(rand()) % (end + 1 - start) + start

这可行。给定相同的种子,就会产生相同的随机数。执行多个randomNumber计算会导致出现多个不同的随机数。通过srand重新播种会再次开始“随机性”。

唯一的缺点是rand()不是均匀分布的。确实,我几乎总是总是得到一组在很大程度上线性增长的数字。

听起来arc4random_uniform会生成更多均匀的随机输出,但是根据我的研究,无法播种arc4random,因为它是在第一次调用时就本身进行播种,并且不一定要“设计”为外部播种。

所以我的问题;有没有比srand()/ rand()更好的替代方法,它仍然可以为给定的种子提供相同的输出,但是这些输出分布更均匀?

谢谢-亚当


问题答案:

事实证明,srand / rand组合可以满足我的需求,导致结果显示不“均匀分布”的问题是我自己的逻辑中的一个错误。

供参考,本质上我是在做这件事(实际上,它要复杂得多,但出于演示目的):

let start = 0
let end = 100

for x in 0..<10 {

   let seed = UInt32(x)
   srand(seed)
   let randomNumber = Double(rand()) % (end + 1 - start) + start

   // Do something with random number

}

用上面更简单的形式编写的问题变得很明显。我在循环的每次迭代中都重新播种,种子值只是线性增加。因此,随机结果也呈线性增加。

简单的解决方案是不重新种子每次循环迭代,而是在循环之前种子一次。例如:

let start = 0
let end = 100
let seed = UInt32(100)
srand(seed)

for x in 0..<10 {

   let randomNumber = Double(rand()) % (end + 1 - start) + start

   // Do something with random number

}

通过此简单的更改,结果值似乎在示例中使用的0到100范围内确实均匀分布。我不能确定是否有“更统一”的方式来做到这一点,但是我认为这是因为我读过arc4random比drand
/ rand / erand / etc函数“更优越”,以产生统一的随机数,但是至少这似乎符合我的需求。

如果其他人想出一种更好的方法来实现我所追求的目标,我将把这个问题搁置一段时间。



 类似资料:
  • 问题内容: 我听说过这两种语言都称为“传播语法”和“传播算子”,后者更为流行。有关MDN文档的URL表明,它最初被称为扩展运算符,但后来更改为扩展语法,而MDN的运算符列表未提及它。 Google似乎建议使用术语“运营商”来普及和接受,例如Microsoft文档和[es6-features.org]等网站都将其称为“运营商”。 在ECMAScript的上下文中,哪一个术语最正确(如果有),为什么?

  • 问题内容: 我只是想知道Swift是像php一样的动态还是静态的,我的意思是我可以在应用程序运行时生成类吗? 问题答案: 它是静态的-非常静态。编译器必须有关于所有类和功能的全部信息 在编译时 。您可以(使用)“扩展”现有的类,但是即使那样,您也必须在编译时完全定义该扩展所包含的内容。 Objective-C是动态的,并且在现实生活中,由于您可能会在Cocoa的存在下使用Swift,因此可以使用O

  • 所以,我读了这里所有的文章,不幸的是,我似乎找不到我要找的答案。我已经接近了,但某些魔弦暗示了我。 我正在Ubuntu17.10服务器上运行hls直播(nginx)。简而言之,我可以使用以下方法让服务器一次运行一个视频,并使用ffmpeg(带字幕): 但是,我无法找到使用此方法运行播放列表的解决方案。这似乎是不可能的,当我通过sout(内部或外部)尝试vlc时,我发现要么是缓冲区问题,要么是aac

  • 问题内容: 我尝试解析返回json对象的api。我的问题是,在以下示例中,某些键有时是字符串,有时是类似“ Value”键的对象: 我的结构看起来像这样: 我必须告诉我我完全迷路了(是的,我是个迅速的初学者),我找不到解决我问题的方法。我知道我必须使用自定义init,但我不知道如何。 问题答案: 你可以试试

  • 本文向大家介绍arduino 播下种子,包括了arduino 播下种子的使用技巧和注意事项,需要的朋友参考一下 示例 如果重要的是要由生成的数字序列random()不同,则最好使用以下代码指定种子randomSeed():            

  • 问题内容: 将HTTP GET与HTTP POST进行比较时,从安全角度来看有什么区别?这些选择之一在本质上比其他选择更安全吗?如果是这样,为什么? 我意识到POST不会在URL上公开信息,但是其中有什么真正的价值,还是仅仅是通过隐蔽性实现安全性?当出于安全考虑时,是否有理由我应该选择POST? 编辑: 通过HTTPS,对POST数据进行了编码,但是URL是否可以被第三方监听?另外,我正在处理JS