Генерация случайных чисел с помощью GKRandomSource

#ios #swift #random #shuffle #gameplay-kit

#iOS #swift #Случайный #перемешивание #игровой процесс-комплект

Вопрос:

Я использую GKRandomSource in a struct для возврата случайной вдохновляющей цитаты в представлении. Есть ли способ вернуть это случайное число и опустить предыдущую запись? Таким образом, пользователь не получает одну и ту же цитату дважды подряд.

 let inspiration = [
    "You are looking rather nice today, as always.",
    "Hello gorgeous!",
    "You rock, don't ever change!",
    "Your hair is looking on fleek today!",
    "That smile.",
    "Somebody woke up on the right side of bed!"]

func getRandomInspiration() -> String {
    let randomNumber = GKRandomSource.sharedRandom().nextIntWithUpperBound(inspiration.count)
    return inspiration[randomNumber]
}
  

Комментарии:

1. лучше всего иметь копию массива, и каждый раз, когда вы берете случайный индекс, вы удаляете его из массива, а затем случайным образом меняете от 0 до нового размера массива

Ответ №1:

Чтобы не генерировать одну и ту же цитату, следите за последней в вызываемом struct свойстве lastQuote . Затем уменьшите максимальное случайное число на 1, и если вы генерируете то же самое lastQuote , что и, используйте max вместо этого.

 struct RandomQuote {
    let inspiration = [
        "You are looking rather nice today, as always.",
        "Hello gorgeous!",
        "You rock, don't ever change!",
        "Your hair is looking on fleek today!",
        "That smile.",
        "Somebody woke up on the right side of bed!"]

    var lastQuote = 0

    mutating func getRandomInspiration() -> String {
        let max = inspiration.count - 1
        // Swift 3
        // var randomNumber = GKRandomSource.sharedRandom().nextInt(upperBound: max)
        var randomNumber = GKRandomSource.sharedRandom().nextIntWithUpperBound(max)
        if randomNumber == lastQuote {
            randomNumber = max
        }
        lastQuote = randomNumber
        return inspiration[randomNumber]
    }
}

var rq = RandomQuote()
for _ in 1...10 {
    print(rq.getRandomInspiration())
}
  

Комментарии:

1. Спасибо за ответ; for _ in 1...10 не может быть передан на верхнем уровне. Есть ли что-то, что я должен там исправить? (запуск в swift)

2. Это всего лишь демонстрация того, как использовать структуру RandomQuote. Вы можете добавить переменную rq=RandomQuote() в качестве свойства класса, такого как ViewController, и вызвать rq.getRandomInspiration() внутри любой функции в этом VC, чтобы получить цитату.