用SecRandomCopyBytes生成范围内的随机数

我使用SecRandomCopyBytes来生成一个安全的随机数字。

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

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

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

任何提示将感激!

UPDATE

看到我做了一个愚蠢的问题,我觉得不得不分享解决scheme,扩大了Inttypes:

 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 } } 

你总是可以通过应用模和加法指定一个范围,检查这个伪代码:

 // random number in the range 1985-2014 r = rand() % 30 + 1985 

iOS 9引入了GameplayKit,它提供了SecureRandom.nextInt() Java等价物。

Swift 3中使用它:

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

请参阅此答案以获取更多信息: https : //stackoverflow.com/a/31215189/1245231

Interesting Posts