[英]Generating a random number in Swift
我在https://www.hackingwithswift.com/read/35/2/generating-random-numbers-in-ios-8-and-earlier中讀到,生成隨機數的最佳方法是使用
let r = arc4random_uniform(UInt32(_names.count))
let name : String = _names[Int(r)]
但是我必須投射兩次才能獲得隨機數似乎很奇怪,我應該怎么做才能避免投射?
這真的取決於你想避免多少鑄造。 你可以簡單地將它包裝在一個函數中:
func random(max maxNumber: Int) -> Int {
return Int(arc4random_uniform(UInt32(maxNumber)))
}
那么你只需要做一次丑陋的鑄造。 你想要一個具有最大數量的隨機數的地方:
let r = random(max: _names.count)
let name: String = _names[r]
附帶說明一下,由於這是 Swift,因此您的屬性不需要_
在它們前面。
我真的很喜歡使用這個擴展
extension Int {
init(random range: Range<Int>) {
let offset: Int
if range.startIndex < 0 {
offset = abs(range.startIndex)
} else {
offset = 0
}
let min = UInt32(range.startIndex + offset)
let max = UInt32(range.endIndex + offset)
self = Int(min + arc4random_uniform(max - min)) - offset
}
}
現在您可以生成一個隨機Int
指示范圍
let a = Int(random: 1...10) // 3
let b = Int(random: 0..<10) // 6
let c = Int(random: 0...100) // 31
let d = Int(random: -10...3) // -4
你可以使用gameplaykit
let random = GKRandomDistribution(lowestValue: 0, highestValue: 100)
let r = random.nextInt()
Luca 的修改后的答案在 Swift 4 中編寫為擴展
/// Returns random number within given range, upper bound included, eg. -1...0 = [-1, 0, 1]
extension CountableClosedRange where Bound == Int
{
var random: Int
{
let range = self
let offset: Int = range.lowerBound < 0 ? abs(range.lowerBound) : 0
let min = UInt32(range.lowerBound + offset)
let max = UInt32(range.upperBound + offset)
let randomNumber = Int(min + arc4random_uniform(max - min + 1)) - offset
return randomNumber
}
}
/// Returns random number within given range, upper bound not included, eg. -1...0 = [-1, 0]
extension CountableRange where Bound == Int
{
var random: Int
{
let range = self
let offset: Int = range.lowerBound < 0 ? abs(range.lowerBound) : 0
let min = UInt32(range.lowerBound + offset)
let max = UInt32(range.upperBound + offset)
let randomNumber = Int(min + arc4random_uniform(max - min)) - offset
return randomNumber
}
}
例子:
(0...10).random
(0..<10).random
您可以初始化一個隨機元素:
let randomInt = Int.random(in: 0...1)
let randomDouble = Double.random(in: 0...1)
你也可以從一個集合中隨機抽取一個元素
let randomInt = (0...9).randomElement()
還有另一種方便的方法,您可以在數組上使用您可能需要的洗牌方法:
let shuffled = [1, 2, 3, 4].shuffled()
或者你可以使用
let name : String = _names[ Int(arc4random()) % _names.count ]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.