Java 使用SecRandomCopyBytes生成范围内的随机数

Java 使用SecRandomCopyBytes生成范围内的随机数,java,ios,swift,secure-random,Java,Ios,Swift,Secure Random,我正在使用生成一个安全的随机数 有没有办法指定“范围” 我需要获得这段Java代码的相同行为: SecureRandom r = new SecureRandom(); char x = (char)(r.nextInt(26) + 'a'); 任何提示都将不胜感激 更新 看到我提出了一个愚蠢的问题,我觉得有必要分享这个解决方案,我提出了扩展Int类型: public extension Int { /** Create a random num Int in range :par

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

有没有办法指定“范围”

我需要获得这段
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
  }
}
公共扩展名Int{ /** 在范围内创建一个随机数值Int :param:较低的整数 :param:上限数字Int :return:random number Int */ 公共静态func random(#min:Int,max:Int)->Int{ 返回Int(arc4random_uniform(UInt32(max-min+1)))+min } /** 在范围内创建一个安全的随机num Int :param:较低的整数 :param:上限数字Int :return:random number Int */ 公共静态func secureRandom(#min:Int,max:Int)->Int{ 如果max==0{ NSException(名称:“secureRandom”,原因:“最大数量必须大于0”,用户信息:nil.raise() } var randomBytes=UnsafeMutablePointer.alloc(8) SecRandomCopyBytes(kSecRandomDefault,8,randomBytes) 让randomNumber=unsafeBitCast(randomBytes,UInt.self) 返回整数(随机数)%max+min } }
始终可以通过应用模和加法来指定范围,请选中此伪代码:

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

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

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

有关更多信息,请参见此答案:

Oh。。我才意识到我提出了这个故事中最愚蠢的问题!哈哈,不用担心:D有时候本能让你在思考之前先发布一个问题;)这也发生在数小时的代码移植之后!杀了我!此解决方案将导致有偏随机数生成器,除非max参数恰好可被UInt8.max整除。这个问题通常被称为模偏差。请参阅这篇文章,了解一个很好的解释,以及一个更安全的解决方案:根据:@Ivan Swift 4.2应该使用加密安全随机源。请查看编辑后的答案。此解决方案不会返回最小..最大值之间的随机数,但在最小..(最小+最大)范围内,我建议使用Swift的4.2实现:
import GameplayKit

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