为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Swift中生成一个随机数而不重复以前的随机数?

如何在Swift中生成一个随机数而不重复以前的随机数?

吃鸡游戏 2019-11-04 10:02:59
我对Swift和编程逻辑很陌生,所以请多多包涵如何在Swift中生成0到9之间的随机数而不重复最后生成的数字?因为相同的数字不会连续出现两次。
查看完整描述

3 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

Swift 5更新


这是一个很好的技巧,可以从以前不仅仅选择的数字中进行平均选择。


您有10个数字,但只想从9个数字中选择(0到9,但不包括前一个数字)。如果将范围减少1,则可以从9个随机数中进行选择,然后将重复的数字替换为该范围的前一个最高数字。这样,您每次只需生成一个随机数即可获得统一性。


这可以Int.random(in:excluding:)在传递所需值的位置实现exclude。


extension Int {

    static func random(in range: ClosedRange<Int>, excluding x: Int) -> Int {

        if range.contains(x) {

            let r = Int.random(in: Range(uncheckedBounds: (range.lowerBound, range.upperBound)))

            return r == x ? range.upperBound : r

        } else {

            return Int.random(in: range)

        }

    }

}

例:


// Generate 30 numbers in the range 1...3 without repeating the

// previous number  

var r = Int.random(in: 1...3)

for _ in 1...30 {

    r = Int.random(in: 1...3, excluding: r)

    print(r, terminator: " ")

}

print()

1 3 2 1 2 1 3 2 1 3 1 3 2 3 1 2 3 2 1 3 2 1 3 1 2 3 2 1 2 1 3 2 3 2 1 3 1 2 1 2


上一个答案:


var previousNumber = arc4random_uniform(10)   // seed the previous number


func randomNumber() -> UInt32 {

    var randomNumber = arc4random_uniform(9)  // generate 0...8

    if randomNumber == previousNumber {

        randomNumber = 9

    }

    previousNumber = randomNumber

    return randomNumber

}


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 591 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信