Swift - 随机数(最小 - 最大)避免重复

Swift - random number (min - max) avoiding repetition

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

示例结果:

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

创建 global/static 变量,您将在其中记住最后一个有效生成的数字。然后添加 if 语句,当您生成与该变量相同(/彼此相邻)的数字时,它将递归调用 randomNumber。如果没有生成任何数字,则设置数字超出间隔。

你说的是"I want to avoid ... two numbers next to each other"所以我不明白8 ,7是错的但是8, 9是对的。

总之,我的回答答案是基于你的例子。只需发送之前的值并循环直到得到满意的答案:

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 次迭代之后结束。