使用 SecRandomCopyBytes 生成范围内的随机数
Generate random number in range with SecRandomCopyBytes
我正在使用 SecRandomCopyBytes
生成安全随机数。
有没有办法指定 "range"?
我需要获得与这段 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
}
}
您始终可以通过应用模和加法来指定范围,检查此伪代码:
// random number in the range 1985-2014
r = rand() % 30 + 1985
编辑:Swift 4.2 允许使用 Int
class:
生成随机数
let randomNumber = Int.random(in: 0 ..< 26)
随机源应该是加密安全的SystemRandomNumberGenerator
另请参阅:
旧答案:
iOS 9 引入了 GameplayKit,它提供 SecureRandom.nextInt()
Java 等价物。
在Swift中使用它 3:
import GameplayKit
// get random Int
let randomInt = GKRandomSource.sharedRandom().nextInt(upperBound: 26)
查看此答案了解更多信息:
我正在使用 SecRandomCopyBytes
生成安全随机数。
有没有办法指定 "range"?
我需要获得与这段 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
}
}
您始终可以通过应用模和加法来指定范围,检查此伪代码:
// random number in the range 1985-2014
r = rand() % 30 + 1985
编辑:Swift 4.2 允许使用 Int
class:
let randomNumber = Int.random(in: 0 ..< 26)
随机源应该是加密安全的SystemRandomNumberGenerator
另请参阅:
旧答案:
iOS 9 引入了 GameplayKit,它提供 SecureRandom.nextInt()
Java 等价物。
在Swift中使用它 3:
import GameplayKit
// get random Int
let randomInt = GKRandomSource.sharedRandom().nextInt(upperBound: 26)
查看此答案了解更多信息: