使用 arc4random 生成的 Bools 的控制数量

Control quantity of Bools generated using arc4random

在我的 spritekit 游戏中,我生成了两个敌人之一。使用 arc4random_uniform(2) 随机生成的 bool 决定生成的敌人。

我正在尝试创建一种控制分发的方法。基本上,我不希望它连续生成 3 1's (true's)...

我认为最好的方法是在每次生成某些东西时进行检查,并递增计数,如果超过计数,则将生成的 bool 更改为相反的值。

我想我有点困惑,因为我无法让它工作。

有没有一种简单的方法可以做到这一点,或者可以修改我的代码以使其正常工作吗?谢谢。

var randomSequenceNumber = Int(arc4random_uniform(2)) == 0 ? true: false

    if randomSequenceNumber {
        seqCount = randomSequenceNumber
        obNum++
        print("Obstacle Count: ", obNum)
    }

    if obNum <= 3 {
        randomSequenceNumber = !seqCount
        obNum = 0
    }

(估计脑子放了个大屁)

Gameplaykit introduces some new random number generators including GKShuffledDistribution,根据 Apple 的说法,它完全符合您的要求:

A GKShuffledDistribution object produces random numbers that across many samplings are uniformly distributed, but where short sequences of similar values are unlikely

nextBool() 应该给你一个新的分布特征内的随机布尔值。

希望这对您有所帮助,

西蒙

我想按顺序生成随机 bools,但如果相同的 bool 值连续生成 3 次以上,则改为相反。

但与此同时,我不只是希望它只是交替,比如 true false true false true false

所以它可以生成 true false true false true falsetrue true false false true false true false false true false 但永远不会 true true true true false true false true false false false false... 等

这意味着我需要存储值,比较它们,如果最后 x 数量匹配则更改值,并重置存储值以备下次比较。

我是这样做的:

var randSeqArray: [Bool] = []                          //empty array for bools

在我生成 bools 的函数中:

    randSeqArray.append(randomBool)                    //add bool to array
    if randSeqArray.count == 2 {                       //if matches count
        if randSeqArray[0] == randSeqArray[1] {        //if elements match
            print("-------> last two bools matched!")
            randomBool = !randomBool                   //change bool to opposite
        }
        randSeqArray.removeAll(keepCapacity: true)     //empty array
        randSeqArray.append(randomBool)                //add bool back, ready to check next time
    }

显然,此代码可确保随机布尔交替(用于测试),但可以采用它以允许在重置之前最多 x 连续匹配布尔。

这是上面的示例,它检查最后生成的 3 个布尔值是否匹配,确保您永远不会连续获得超过 2 个相同的布尔值:

    randSeqArray.append(randomBool)
    if randSeqArray.count == 3 {
        if randSeqArray[0] == randSeqArray[1] && randSeqArray[1] == randSeqArray[2] {
            print("-------> last three bools matched!")
            randomBool = !randomBool
        }
        randSeqArray.removeAll(keepCapacity: true)
        randSeqArray.append(randomBool)
    }