Swift - 随机数(min - max)避免重复

时间:2016-08-08 16:56:44

标签: random swift2

我有一个函数可以在两个给定值之间生成一个整数随机数。我的应用程序中的此功能只会被调用两次,但我想避免它生成两个相同的数字或两个数字彼此相邻。我怎么能修复下面的功能才能实现呢?

示例结果:

1, 1 = wrong
1, 2 = wrong
8, 7 = wrong

8, 12 = correct
1, 3 = correct
3, 0 = correct

功能:

func randomNumber(minX:UInt32, maxX:UInt32) -> Int {
        let result = (arc4random() % (maxX - minX + 1)) + minX
        return Int(result)
    }

编辑: 它怎么可能是重复??? 我不是要求对数组进行洗牌,但我想从两个给定的数字生成一个Int

2 个答案:

答案 0 :(得分:0)

创建全局/静态变量,您将记住上次生成的有效数字。然后添加if语句,它将递归调用randomNumber,当您生成与该变量相同的(/旁边的)数字时。如果没有生成任何数字,请设置超出间隔的数字。

答案 1 :(得分:0)

你说"我想避免......两个数字彼此相邻"所以我不明白8 ,7是错误的,但8, 9是正确的。

无论如何,我的回答是基于你的例子。只需发送前一个值并循环,直到得到满意的asnwer:

func randomNumber(minX:UInt32, maxX:UInt32, previousNumber: Int? = nil) -> Int {
    var result: Int

    repeat {
        result = Int((arc4random() % (maxX - minX + 1)) + minX)
    } while previousNumber == result || previousNumber == result + 1

    return result
}
let r1 = randomNumber(1, maxX: 3)
let r2 = randomNumber(1, maxX: 3, previousNumber: r1)

如果没有可满足您条件的数字,这将导致无限循环,例如:

randonNumber(1, maxX: 2, previousNumber: 2)

您应该通过数学方法计算可能性并创建一个计数器来添加guard语句,以便repeat循环结束,比如100次迭代。