用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