Наборы случайных чисел без дубликатов - PullRequest
0 голосов
/ 30 апреля 2020

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

Я знаю это очень

import Foundation

var randomNumbers: [Int] = []

for _ in 0...5 {
    let randomInt = Int.random(in: 0...160)
    randomNumbers.append(randomInt)
}

print(randomNumbers)

Это печатает 6 чисел от 1 до 160. Я хочу сделать это, скажем, 4 раза. Как бы вы сделали так, чтобы вы не могли сидеть вместе с людьми, с которыми вы сидели до этого

1 Ответ

0 голосов
/ 30 апреля 2020

Я бы создал массив чисел 1-160 и рандомизировал их методом shuffled. Если вы хотите получить подмножество случайных чисел, возьмите последние шесть, а затем удалите последние шесть из массива. Таким образом, вы не получите дубликатов.

class RandomNumberGenerator {

    private var possible: [Int] = []

    init(range: ClosedRange<Int>) {
        reset(range: range)
    }

    func next(count: Int) -> [Int] {
        let result = possible.suffix(count).map { $0 }
        possible.removeLast(result.count)
        return result
    }

    func reset(range: ClosedRange<Int>) {
        possible = range.map { $0 }.shuffled()
    }

    private init() {}
}

let rando = RandomNumberGenerator(range: 1...160)
for _ in 0..<4 {
    print(rando.next(count: 6))
}

Обратите внимание, что в массиве не будет чисел, если вы вызовете его более 26 раз. Поэтому для восстановления всех значений в массиве просто вызовите reset:

rando.reset(range: 1...160)
...