【问题标题】:How do I seed the rand() function in Objective-C?如何在 Objective-C 中播种 rand() 函数?
【发布时间】:2012-08-20 14:35:43
【问题描述】:

我正在开发的部分内容是一个随机的公司名称生成器。它从几个名称部分数组中提取。我使用rand() 函数来绘制随机名称部分。但是,每次启动应用程序时,总是以相同的顺序生成相同的“随机”数字,因此总是会出现相同的名称。

所以我在 SO 周围进行了搜索,在 C 语言中有一个 srand() 函数来“播种”随机函数,例如当前时间以使其更加随机 - 例如 srand(time(NULL))。 Objective-C 中是否有类似的东西可以用于 iOS 开发?

【问题讨论】:

    标签: objective-c ios c random srand


    【解决方案1】:

    函数rand()srand() 是标准C 库的一部分,与C 库的其他部分一样,我们在使用Objective-C 进行iOS 开发时完全可以使用它们。请注意,这些例程已被random()srandom() 取代,它们与rand()srand() 具有几乎相同的调用约定,但在更长的周期内产生更好的结果。还有一个srandomdev() 例程,它使用随机数设备初始化随机数生成器的状态。这些也是标准 C 库的一部分,可用于 iOS 中的 Objective-C。

    【讨论】:

      【解决方案2】:

      为什么不使用不需要种子的arc4random?你可以这样使用它:

      int r = arc4random();
      

      Here's 将其与rand() 进行比较的文章。与rand() 相比,arc4random() 手册页对此进行了说明:

      arc4random() 函数使用 arc4 密码使用的密钥流生成器,它使用 8*8 8 位 S 盒。 S-Box 可以处于大约 (21700) 状态。 arc4random() 函数返回伪 0 到 (232)-1 范围内的随机数,因此具有 rand(3) 范围的两倍和 随机(3)。

      如果你想要一个范围内的随机数,你可以使用arc4random_uniform() 函数。例如,要生成 0 到 10 之间的随机数,您可以这样做:

      int i = arc4random_uniform(11);
      

      以下是手册页中的一些信息:

      arc4random_uniform(upper_bound) 将返回一个小于upper_bound 的均匀分布的随机数。建议使用 arc4random_uniform() 而非 ``arc4random() % upper_bound'' 之类的结构,因为当上限不是 2 的幂时,它可以避免“模偏差”。

      【讨论】:

      • 技术上@torrey.lyons 更直接地回答了我的问题,但我绝对更喜欢 arc4random 而不是 srand()。谢谢
      猜你喜欢
      • 2012-10-24
      • 1970-01-01
      • 2020-08-25
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 2012-11-08
      • 2023-02-24
      相关资源
      最近更新 更多