swift - 通过数字范围随机化

标签 swift random arc4random

我试图让应用程序的这一部分工作,用户单击按钮,标签会打印 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/

相关文章:

javascript - 老虎机随机发生器

java - 随机调用文本文件中不同命令的百分比

swift - 使用 Swift 生成随机数

ios - VK iOS sdk授权

javascript - Swift 将数据从 WebView 发布到 native 应用程序

c++ - 通过泊松过程生成随机到达 C++

ios - arc4random_uniform 在 OSX 10.10.4 上的 Xcode 7.0 beta (7a176x) 中不可用

ios - 保留 UISearchBar 的边距

ios - UITabBarController 如何调整其 subview 的大小?帮助创建辅助 TabBar

swift - 使用 arc4random_uniform 返回整数和非整数 double