2015-04-07 70 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

很好解决方案,谢谢! –