我正在尝试将随机数(1 ... 8)添加到数组中。 我想这样做16次。线索是,每个数字应该只在那里两次。我到目前为止工作,但我不认为这是一个干净的方法。而我的方式,它是不可扩展的。如果我想要它,让我们说例如24个元素,并且所有它们都是3次,我必须重写所有代码。你知道如何解决这个问题吗?提前谢谢!
var Numbers: [Int] = []
var randomNumber: Int = 0
let size: Int = 16
var index1 = 0
var index2 = 0
var index3 = 0
var index4 = 0
var index5 = 0
var index6 = 0
var index7 = 0
var index8 = 0
// Methods / Functions
func createRandomNumber() {
randomNumber = Int(arc4random() % 8 + 1)
}
func checkTwins() {
switch randomNumber {
case 1:
index1++
if index1 <= 2 {
Numbers.append(randomNumber)
}
else {
addRandomNumbertoArray()
}
case 2:
index2++
if index2 <= 2{
Numbers.append(randomNumber)
}
else {
addRandomNumbertoArray()
}
case 3:
index3++
if index3 <= 2 {
Numbers.append(randomNumber)
}
else {
addRandomNumbertoArray()
}
case 4:
index4++
if index4 <= 2 {
Numbers.append(randomNumber)
}
else {
addRandomNumbertoArray()
}
case 5:
index5++
if index5 <= 2 {
Numbers.append(randomNumber)
}
else {
addRandomNumbertoArray()
}
case 6:
index6++
if index6 <= 2 {
Numbers.append(randomNumber)
}
else {
addRandomNumbertoArray()
}
case 7:
index7++
if index7 <= 2 {
Numbers.append(randomNumber)
}
else {
addRandomNumbertoArray()
}
case 8:
index8++
if index8 <= 2 {
Numbers.append(randomNumber)
}
else {
addRandomNumbertoArray()
}
default: println("Generated Number out of Index")
}
}
func addRandomNumbertoArray() {
createRandomNumber()
checkTwins()
}
func fillUpArray() {
for _ in 1...size {
addRandomNumbertoArray()
}
}
// Calls
fillUpArray()
println(Numbers)
这是用Swift Playground编写的
答案 0 :(得分:1)
你可以做的是:首先填充一个包含每个的数组 数字1,...,8两次:
var array : [Int] = []
for i in 1 ... 8 {
array.extend(Repeat(count: 2, repeatedValue: i))
}
然后随机随机播放数组:
array.shuffle()
其中shuffle()
是Fisher-Yates shuffle。
可以在中找到Swift实现
How do I shuffle an array in Swift?:
extension Array {
mutating func shuffle() {
for i in 0..<(count - 1) {
let j = Int(arc4random_uniform(UInt32(count - i))) + i
swap(&self[i], &self[j])
}
}
}
这可以毫无问题地扩展到更大的阵列并且更多重复 元件。