2015-04-07 85 views
2

我試圖從letters中獲得26箇中的20個隨機值,這些值也必須包含來自數組name的元素。 finalArray會是什麼樣子:["S", "A", "M", "A", "N", "T", "H", "A", "I", "J", "K", "L", "S", "N", "O","P","Q", "R", "S", "A"](隨機)從數組中獲取多個值?

到目前爲止:

var letters: [String] = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O","P","Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"] 


var name: [String] = ["S", "A", "M", "A", "N","T","H","A"] 


//Create finalArray elements 

var availableLetters = letters.filter { value in 
    !contains(name, value) 
} 

var finalArray = availableLetters + name 

我試圖做的:

//get 20 objects 
var length = name.utf16Count 

var beforeArray = finalArray[0...19] 

//minus length of the word 

var letterCount = beforeArray.count - length 

// add missing letters 
beforeArray = letters[0...letterCount] + name 

這顯然是錯誤的,結果是非常不穩定的。我可以使用什麼作爲簡單的解決方法?我怎麼能實現它?

回答

2

從你的例子看來,你想採取name,然後右鍵填充字母表中的長度爲20的字母。由於看起來你不介意重複隨機字母,這使事情變得更容易。

棘手的部分是生成一個n個隨機數的序列,直到最大。如果你有這個,你可以使用這些數字作爲你的字母數組中的索引來選擇隨機字符。這裏有一種方法來生成序列:

// Struct representing a sequence of count 
// random numbers in range 0..<max 
struct RandomSequence: SequenceType { 
    let count: Int 
    let max: Int 
    func generate() -> GeneratorOf<Int> { 
     var i = 0 
     return GeneratorOf { 
      i++ < self.count 
       ? Int(arc4random_uniform(UInt32(self.max))) 
       : nil 
     } 
    } 
} 

一旦你有了這個,它可以被用來生成填充:

let name = Array("SAMANTHA") 
let alphabet = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ") 

let targetCount = 20 
let paddingCount = targetCount - name.count 

let ranseq = RandomSequence(count: paddingCount, max: alphabet.count) 
let padding = map(ranseq) { alphabet[$0] } 

let padded = name + padding 
// padded = ["S", "A", "M", "A", "N", "T", "H", "A", "W", "O", "C", "M", "L", "B", "L", "A", "N", "H", "I", "I"] 

如果你真的想用隨機字母洗牌的名字之後,看看this question的最佳答案。但作爲上述技術的第二步,最好做到這一點,而不是試圖將兩個步驟結合在一起。

值得一提的是,如果name是一個字符串,你想要的結果結束了作爲一個字符串,你並不需要把陣列中的這種方法的工作:

let name = "SAMANTHA" 
let alphabet = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ") 

let targetCount = 20 
let paddingCount = targetCount - count(name) 

let ranseq = RandomSequence(count: paddingCount, max: alphabet.count) 
let padding = map(ranseq) { alphabet[$0] } 

let padded = name + padding 
// padded = "SAMANTHASLHMPRDYRHFC" 
+0

很好解決方案,謝謝! –