我试图让应用程序的这一部分工作,用户单击按钮,标签会打印 1-12 之间随机生成的数字。我已经成功做到了这一点,但我也希望它不要重复已打印的任何随机数。
我尝试做的是将任何打印的数字放入一个数组中,然后在每次生成新数字时检查该数组。
我已经让它在 Playground 中运行,但无法在实际项目中运行。
这是我的项目的代码。
var usedNumbers = [Int]()
var randomConv = 0
func randomize() {
lblRandom.text = "\(arc4random_uniform(12) + 1)"
randomConv = Int(lblRandom.text!)!
}
@IBAction func btnRandomPressed(sender: AnyObject) {
randomize()
if usedNumbers.contains(randomConv) {
randomize()
} else {
usedNumbers.append(randomConv)
}
if usedNumbers.count == 12 {
btnRandom.hidden = true
}
}
这是我的 Playground 中的代码。
var lblRandom = "\(arc4random_uniform(12) + 1)"
var randomConv = 0
var usedNumbers = [Int]()
func randomize() {
lblRandom = "\(arc4random_uniform(12) + 1)"
randomConv = Int(lblRandom)!
}
repeat {
randomize()
if usedNumbers.contains(randomConv) {
randomize()
} else {
usedNumbers.append(randomConv)
print(lblRandom)
}
} while usedNumbers.count < 12
最佳答案
系统已经有一个用于此目的的工具: GKShuffledDistribution
是 GameplayKit 中众多随机化实用程序之一。它所做的与其他不同的一件事GKRandom
类正是您所要求的 - 它确保不会重复已经从随机池中“抽取”的值。
这是一个例子:
import GameplayKit
let shuffle = GKShuffledDistribution(forDieWithSideCount: 12)
for _ in 1...100 { print(shuffle.nextInt()) }
使用 Playground 绘制结果图表,您会发现没有数字会立即重复(图表中没有水平线),而且没有数字每 12 个“滚动”重复一次以上。
如果您想自己实现类似的行为,您可以通过使用类似 Set
的内容来改进您的其他尝试(以及迄今为止的其他答案)。或Dictionary<Int, Bool>
存储已使用或尚未使用的值,因为这些值可以响应 contains
无需搜索整个数据结构。
关于swift - 通过数字范围随机化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34622567/