2016-02-22 90 views
1

我有一些關於swift 2 random的問題。我有一個枚舉子類的所有卡例子:如何從枚舉中選擇10個隨機卡(或數字)

enum CardName : Int{ 

case Card2Heart = 0, 
Card2Diamond, 
Card2Club, 
Card2Spade, 
Card3Heart..... } 

我想在didMoveToView

+0

請添加更直接的問題,同時也說明你已經嘗試 – giZm0

回答

1

選擇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上。

+1

值得一提的是,爲了完整起見,這可能會增加相同卡多次。 – Losiowaty

+1

當然。 :)你是對的,我已經給我的答案添加了一個註釋。 – Moritz

+0

嗨,感謝eric :-)我忘了提及uniqe問題以及抱歉。我需要的10個號碼將是唯一的,沒有中繼器選項 – Elidotnet

2

爲了得到一個獨特的,隨機組數字,你可以做以下...

使用從這裏費雪耶茨洗牌...... 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個數字(卡片)。

然後,你可以迭代這個數組來獲得枚舉或者創建一個所有枚舉的數組,從等等開始......有很多方法可以使用它。

+0

Iam得到這個錯誤值'Array '的值在這兩個選項上都沒有成員'shuffleInPlace' – Elidotnet

+0

@Elidotnet是的。您需要使用鏈接堆棧溢出問題中的代碼。 Array上不存在Shuffle。你必須自己添加它。這是另一個問題。 – Fogmeister

0

這是您丟失的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]) 
    } 
    } 
} 
+0

是的,但這已經包含在我的答案中了... – Moritz

0

如何隨機分佈的枚舉值設定

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], []) 
*/