【问题标题】:How to select range of values when using arc4random()使用 arc4random() 时如何选择值的范围
【发布时间】:2010-08-06 02:16:13
【问题描述】:

我可以在使用 arc4random() 时设置一个数字范围吗?仅例如 50-100。

【问题讨论】:

  • 对范围使用模数并添加偏移量,如 arc4random() % 50 + 50;它将为您提供 50 到 99 范围内的随机数。

标签: ios objective-c arc4random


【解决方案1】:

正如下面其他帖子中所指出的,最好使用arc4random_uniform。 (最初编写此答案时,arc4random_uniform 不可用)。除了避免arc4random() % x 的模偏差之外,它还避免了arc4random 在短时间内递归使用时的播种问题。

arc4random_uniform(4)

将生成 0、1、2 或 3。因此您可以使用:

arc4random_uniform(51)

只需将 50 添加到结果中即可获得 50 和 100(含)之间的范围。

【讨论】:

  • 这只给你 0 到 50,不给你 50 到 100 的范围。
  • 就像 Run Loop 说的 add 50. int num = (arc4random() % (51)) +50;
  • 当心这个方法的modulo bias。使用arc4random_uniform()更安全。
  • 我在下面的答案中扩展了@JohnK 的想法。如果您想要更准确的随机数分布,那么绝对值得一看。
【解决方案2】:

扩展 JohnK 的评论。

建议您使用以下函数返回一个范围随机数:

arc4random_uniform(51)

这将返回一个在050 范围内的随机数。

然后你可以像这样添加你的下界:

arc4random_uniform(51) + 50

这将返回一个在50100 范围内的随机数。

我们使用arc4random_uniform(51) 而不是arc4random() % 51 的原因是为了避免使用modulo bias。这在手册页中突出显示如下:

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

简而言之,您会生成一个分布更均匀的随机数。

【讨论】:

    【解决方案3】:
    int fromNumber = 10;
    int toNumber = 30;
    int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber;
    

    将在1030之间生成randon number,即11,12,13,14......29

    【讨论】:

    【解决方案4】:

    您可以使用此代码生成具有范围的随机值:

    //range from 50 to 100
    int num1 = (arc4random() % 50) + 50; or
    int num1 = arc4random_uniform(50) + 50;
    
    //range from 0-100
    int num1 = arc4random() % 100; or
    int num1 = arc4random_uniform(100);
    

    【讨论】:

      【解决方案5】:

      在 Swift 中你可以使用它(灵感来自 @Justyn 的回答)

      func generateRandomKey(fromRange rangeFrom:Int, toRange rangeTo:Int) -> Int{
      
          let theKey = arc4random_uniform(UInt32(rangeTo - rangeFrom)) +  UInt32(rangeFrom)
          return Int(theKey)
      }
      

      总会给你一个随机范围的整数。

      【讨论】:

      • 我认为这需要调整,因为您的范围总是比您想要的少 1。您应该将 rangeTo 增加 1。'let theKey = arc4random_uniform(UInt32((rangeTo + 1) - rangeFrom)) + UInt32(rangeFrom)'
      • 另外,如果你想生成一个随机密钥,你可能应该看看这个:stackoverflow.com/a/24428458/1130260
      【解决方案6】:

      在许多情况下,10 到 30 意味着包容性,(包括 10 和 30)...

      int fromNumber = 10;
      int toNumber = 30;
      toNumber ++;
      int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber;
      

      注意 toNumber 的区别 - fromNumber 现在是 21 ... (20+1),这会产生 0 到 20(含)的可能结果,当添加到 fromNumber (10) 时会产生 10 到 30(含)。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 2021-08-20
      • 2022-11-13
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      相关资源
      最近更新 更多