我正在尝试将随机数 (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 中编写的
最佳答案
你可以做的是:首先填充一个包含每个的数组 数字 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])
}
}
}
这可以毫无问题地扩展到更大的数组和更多的重复 元素。
关于arrays - 将恰好 2 个相等的元素添加到数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29783579/