我有一些關於swift 2 random的問題。我有一個枚舉子類的所有卡例子:如何從枚舉中選擇10個隨機卡(或數字)
enum CardName : Int{
case Card2Heart = 0,
Card2Diamond,
Card2Club,
Card2Spade,
Card3Heart..... }
我想在didMoveToView
我有一些關於swift 2 random的問題。我有一個枚舉子類的所有卡例子:如何從枚舉中選擇10個隨機卡(或數字)
enum CardName : Int{
case Card2Heart = 0,
Card2Diamond,
Card2Club,
Card2Spade,
Card3Heart..... }
我想在didMoveToView
選擇10個隨機卡按照你最後的評論,這裏有一個小,簡化例如具有的約束保持製作卡片的枚舉。
首先,讓我們包括由Fogmeister鏈接的擴展:
extension MutableCollectionType where Index == Int {
/// Shuffle the elements of `self` in-place.
mutating func shuffleInPlace() {
// empty and single-element collections don't shuffle
if count < 2 { return }
for i in 0..<count - 1 {
let j = Int(arc4random_uniform(UInt32(count - i))) + i
guard i != j else { continue }
swap(&self[i], &self[j])
}
}
}
extension CollectionType {
/// Return a copy of `self` with its elements shuffled
func shuffle() -> [Generator.Element] {
var list = Array(self)
list.shuffleInPlace()
return list
}
}
這些擴展將讓我們重新洗牌值的數組。
哪個數組?
有很多,但最簡單的方法可能是讓指數,這是簡單的整數(含卡在你的枚舉的實際編號替換52)的數組:
Array(1...52) // [1, 2, 3, ... , 52]
我們將它洗:我們有一個隨機索引數組。讓我們把卡從這個與你的枚舉:
Array(0...51).shuffle().flatMap({ CardName(rawValue: $0) })
就是這樣,我們的牌以隨機順序數組:
let shuffledDeck = Array(0...51).shuffle().flatMap({ CardName(rawValue: $0) }) // [Card3Heart, Card2Diamond, ...]
,我們可以從中取卡:
func takeCardsFromDeck(number: Int) -> [CardName] {
if shuffledDeck.count > number {
let cards = Array(shuffledDeck[0..<number])
shuffledDeck.removeRange(0..<number)
return cards
}
return []
}
let tenRandomCards = takeCards(10)
當然我們需要從套牌中刪除我們已經處理過的牌,這樣你繪製的每張牌都是唯一的:我們正在使用removeRange。
這個例子的目的很簡單:在繪圖之前,你仍然必須驗證卡片中是否有足夠的卡片以及許多其他複雜性。但它很有趣。 ;)
如果你願意,你可以搜索我在執行這些模型和其他(甲板,經銷商,播放器等),在我PokerHands庫的額外激勵(MIT許可)在GitHub上。
爲了得到一個獨特的,隨機組數字,你可以做以下...
使用從這裏費雪耶茨洗牌...... How do I shuffle an array in Swift?
你可以做...
var numbers = Array(0...51)
numbers.shuffleInPlace()
let uniqueSelection = numbers[0..<10]
或...
let uniqueSelection = Array(0...51).shuffleInPlace()[0..<10]
這將創建一個RANDO m,您從開始的52張卡片中選擇10個數字(卡片)。
然後,你可以迭代這個數組來獲得枚舉或者創建一個所有枚舉的數組,從等等開始......有很多方法可以使用它。
Iam得到這個錯誤值'Array
@Elidotnet是的。您需要使用鏈接堆棧溢出問題中的代碼。 Array上不存在Shuffle。你必須自己添加它。這是另一個問題。 – Fogmeister
這是您丟失的shuffleInPlace()
代碼;
extension MutableCollectionType where Index == Int {
mutating func shuffleInPlace() {
if count < 2 { return }
for i in 0..<count - 1 {
let j = Int(arc4random_uniform(UInt32(count - i))) + i
guard i != j else { continue }
swap(&self[i], &self[j])
}
}
}
是的,但這已經包含在我的答案中了... – Moritz
如何隨機分佈的枚舉值設定
import Darwin // arc4random_uniform
enum E:Int {
case E1, E2, E3, E4, E5, E6, E7, E8, E9, E10
static var set:[E] { return (E.E1.rawValue...E.E10.rawValue).flatMap { E(rawValue: $0) }}
}
func spread(i:Int = 0, arr:[E])->([E],[E]) {
var i = i == 0 ? arr.count : i
var e:[E] = []
var arr = arr
while i > 0 && arr.count > 0 {
let idx = Int(arc4random_uniform(UInt32(arr.count-1)))
e.append(arr.removeAtIndex(idx))
i -= 1
}
return (e,arr)
}
let e1 = spread(3, arr: E.set)
let e2 = spread(2, arr: e1.1)
// ... spread the rest
let e3 = spread(arr: e2.1)
print(e1, e2, e3, separator:"\n")
/*
([E.E8, E.E6, E.E4], [E.E1, E.E2, E.E3, E.E5, E.E7, E.E9, E.E10])
([E.E1, E.E7], [E.E2, E.E3, E.E5, E.E9, E.E10])
([E.E5, E.E3, E.E2, E.E9, E.E10], [])
*/
請添加更直接的問題,同時也說明你已經嘗試 – giZm0