2

我正在使用SecRandomCopyBytes生成一个安全的随机数。

有没有办法指定“范围”?

我需要获得这段Java代码的相同行为:

SecureRandom r = new SecureRandom();
char x = (char)(r.nextInt(26) + 'a');

任何提示将不胜感激!

更新

看到我提出了一个愚蠢的问题,我觉得有必要分享解决方案,扩展 Int 类型:

public extension Int {
  /**
  Create a random num Int in range
  :param: lower number Int
  :param: upper number Int
  :return: random number Int
  */
  public static func random(#min: Int, max: Int) -> Int {
     return Int(arc4random_uniform(UInt32(max - min + 1))) + min
  }

  /**
  Create a secure random num Int in range
  :param: lower number Int
  :param: upper number Int
  :return: random number Int
  */
  public static func secureRandom(#min: Int, max: Int) -> Int {
    if max == 0 {
        NSException(name: "secureRandom", reason: "max number must be > 0", userInfo: nil).raise()
    }
    var randomBytes = UnsafeMutablePointer<UInt8>.alloc(8)
    SecRandomCopyBytes(kSecRandomDefault, 8, randomBytes)
    let randomNumber = unsafeBitCast(randomBytes, UInt.self)
    return Int(randomNumber) % max + min
  }
}
4

2 回答 2

2

编辑:Swift 4.2允许使用Int类生成随机数:

let randomNumber = Int.random(in: 0 ..< 26)

随机源应该是加密安全的SystemRandomNumberGenerator

也可以看看:

旧答案: iOS 9 引入了提供SecureRandom.nextInt()Java 等效的 GameplayKit。

Swift 3中使用它:

import GameplayKit

// get random Int
let randomInt = GKRandomSource.sharedRandom().nextInt(upperBound: 26)

有关更多信息,请参阅此答案:https ://stackoverflow.com/a/31215189/1245231

于 2016-09-29T11:01:23.063 回答
0

您始终可以通过应用模数和加法来指定范围,请检查以下伪代码:

// random number in the range 1985-2014 
r = rand() % 30 + 1985
于 2015-06-11T14:37:17.057 回答