Я бы использовал усеченный алгоритм Фишера-Йейтса для этого, предполагая, что вам нужно часто выбирать наборы из пяти чисел.
Имея колоду «карт», помеченных от 1 до 50, вы перетасовываете свою колоду и возьмите пять верхних карт. Используйте их по своему усмотрению.
Однако, поскольку вам нужно всего пять, вам просто нужно перемешать «пятерку лучших». Это «усеченная» часть Фишера-Йейтса. Перейдите от конца колоды к пяти картам и выберите пять карт под этой картой (включая эту карту), чтобы поменять местами с этой.
Затем, когда вам понадобятся еще пять случайных чисел, перемешайте снова.
// swaps two integers
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
// returns a pointer to an array of ints randomly
// selected between consecutive values in [1, 50]
// num_ints_requested must be <= the size of the deck
const int* ShuffleRandomInts(int num_ints_requested) {
constexpr int kNumInts = 50;
static bool initialized = false;
static int deck[kNumInts];
if (!initialized) {
for (int i = 0; i < kNumInts; ++i) {
deck[i] = i + 1;
}
initialized = true;
}
// do the truncated shuffle
for (int i = kNumInts - 1; i >= kNumInts - num_ints_requested; --i) {
int j = random(0, i);
swap(deck[i], deck[j]);
}
return &deck[kNumInts - num_ints_requested];
}
void loop() {
// do work
...
// get 5 random numbers between 1 and 50
// and do something with them
const int* numbers = ShuffleRandomInts(5);
DoSomethingWithFive(numbers);
// get 10 random numbers between 1 and 50
// (this invalidates the previously selected numbers)
numbers = ShuffleRandomInts(10);
DoSomethingWithTen(numbers);
// do other stuff
...
}
Если вам нужно использовать один набор случайно выбранных чисел после генерации другого набора случайно выбранных чисел, скопируйте эти числа в новый массив перед перетасовкой.
Мы возвращаем указатель на const int
чтобы вы случайно не изменили колоду после ее возврата. Если продолжить аналогию с перетасованной колодой, это будет похоже на раздачу кому-то пяти карт и их вытаскивание карт маркером перед тем, как передать их вам для повторного перемешивания. Вам это не нужно, поэтому вы указываете, что вы не можете изменять числа после их возврата.
(Если вам нужно изменить их, вы должны скопировать их в неконстантный int или не- массив const int).