Контролировать количество Bools, генерируемых с помощью arc4random

В моей игре spritekit я порождаю одного из двух врагов. Враг, который будет порожден, определяется случайным генерируемым булом, используя arc4random_uniform(2),

Я пытаюсь создать способ управления дистрибуцией. По сути, я не хочу, чтобы он генерировал 3 1s (trueх) подряд...

Я подумал, что лучший способ сделать это - проверять каждый раз, когда что-то генерируется, и увеличивать счетчик, и, если он превышает счет, изменить сгенерированный 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
    }

(вероятно, с большим пердением мозга)

2 ответа

Решение

Я хотел генерировать случайные 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 совпадение bools подряд перед его сбросом.

Это приведенный выше пример, который проверяет, совпадают ли последние 3 сгенерированных bool, гарантируя, что вы никогда не получите более 2 одинаковых bools подряд:

    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)
    }

Gameplaykit представляет несколько новых генераторов случайных чисел, включая GKShuffledDistribution который, по словам Apple, делает именно то, что вы ищете:

GKShuffledDistribution объект производит случайные числа, которые во многих выборках равномерно распределены, но где короткие последовательности схожих значений маловероятны

nextBool() должен дать вам новое случайное логическое значение в пределах характеристик распределения.

Надеюсь это поможет,

Саймон

Другие вопросы по тегам