2015-06-11 3 views
2

Я использую SecRandomCopyBytes для генерации безопасного случайного числа.Генерировать случайное число в диапазоне с помощью SecRandomCopyBytes

Есть ли способ указать «диапазон»?

Мне нужно, чтобы получить такое же поведение этого Java кусок кода:

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

Любые советы будут ценить!

UPDATE

Видя, что я сделал глупый вопрос, я чувствую себя вынужденным делить решение, заточенный простирающийся тип 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 
    } 
} 

ответ

1

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

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

Ой .. Я просто понял, что я сделал глупый вопрос в истории! –

+0

haha ​​no worries: D иногда инстинкт, давайте зададим вопрос, прежде чем продумать это;) – nburk

+0

Это также происходит после частых перекодировки кода! Убей меня! –

1

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

Смежные вопросы