2015-06-11 178 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

哈哈不用擔心:D有時候,本能讓你在提問之前發表一個問題;) – nburk

+0

這也發生在幾個小時的代碼移植之後!殺我! –

1

iOS 9引入了GameplayKit它提供了相當於10個Java。

斯威夫特3使用它:

import GameplayKit 

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

看到這個答案的詳細信息:https://stackoverflow.com/a/31215189/1245231

相關問題