【问题标题】:Control quantity of Bools generated using arc4random控制使用 arc4random 生成的 Bool 数量
【发布时间】:2016-03-25 00:48:51
【问题描述】:

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

我正在尝试创建一种控制分发的方法。基本上,我不希望它连续生成 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
    }

(可能有一个大脑袋放屁)

【问题讨论】:

  • 总是在两个“真”之后选择“假”让敌人可预测:)
  • 没错,但有时我会连续获得 6 或 7 个。也许将其更改为 5。仍然是随机的会很好,但如果下一个与前一个 4 相同,则将其更改并重置计数,因此最坏的情况是,您会得到 4 false | 4 真 | 4 false etc...但它仍然可能是 T F T F F T T T F T FF TT F

标签: ios swift boolean arc4random


【解决方案1】:

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

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

所以它可以生成true false true false true false,或true 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
    }

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

这是检查最后 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)
    }

【讨论】:

    【解决方案2】:

    Gameplaykit 引入了一些新的随机数生成器,包括 GKShuffledDistribution,根据 Apple 的说法,它完全可以满足您的需求:

    GKShuffledDistribution 对象产生随机数,这些随机数在许多采样中是一致的 分布式,但不太可能出现类似值的短序列

    nextBool() 应该在分布特征内为您提供一个新的随机布尔值。

    希望对你有帮助,

    西蒙

    【讨论】:

    • 我以为这是用来洗牌不重复的东西?所以数字 1 到 10 是随机顺序的吗?如果我使用它,当我不知道需要生成多少时,我必须事先生成一个布尔列表:(
    • 不 - 它可以满足您的需求。生成一个随机数流,其中不太可能出现类似值的短序列 - 我在答案中添加了指向 Apple 文档的链接。
    • 好的,我去看看。但我只考虑两个值,它产生 T F T F T F T F T 的概率很可能,这不是我想要的。
    • 分布有一个nextBool() 方法,该方法在分布特征内生成并返回一个新的随机布尔值,即没有相同布尔值的序列:)
    • 我不太明白 nextBool() 如何在没有任何技巧的情况下给出所需的结果。但是,如果使用了可接受的长度范围(就重复而言),请确实认为 GKShuffleDistribution 可以用于此目的。也许吧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多