Генерация случайного числа в диапазоне с SecRandomCopyBytes

Я использую 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
  }
}

2 ответа

Решение

Вы всегда можете указать диапазон, применяя модуль и сложение, проверьте этот псевдокод:

// 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)

См. Этот ответ для получения дополнительной информации: /questions/10007252/kak-generirovat-sluchajnoe-chislo-na-yazyike-apple-swift/10007274#10007274

Другие вопросы по тегам