Для 6 из 50 я не слишком уверен, что буду беспокоиться об эффективности, поскольку вероятность дублирования относительно невелика (всего 30%, по моим подсчетам за пределами конверта).Вы можете довольно легко просто вспомнить предыдущие сгенерированные вами числа и выбросить их, что-то вроде (псевдокод):
n[0] = rnd(50)
for each i in 1..5:
n[i] = n[0]
while n[1] == n[0]:
n[1] = rnd(50)
while n[2] == any of (n[0], n[1]):
n[2] = rnd(50)
while n[3] == any of (n[0], n[1], n[2]):
n[3] = rnd(50)
while n[4] == any of (n[0], n[1], n[2], n[3]):
n[4] = rnd(50)
while n[5] == any of (n[0], n[1], n[2], n[3], n[4]):
n[5] = rnd(50)
Однако, это сломается, когда вы перейдете с 6 на 50до 48 из 50 или 6 из 6, поскольку дубликаты начинают становиться более вероятными далеко .Это потому, что пул доступных чисел становится меньше, и вы в конечном итоге выбрасываете все больше и больше.
Для очень эффективного решения, которое дает вам подмножество ваших значений с ноль возможностью дублирования (и никакой ненужной предварительной сортировки), Fisher-Yates - это путь.
dim n[50] // gives n[0] through n[9]
for each i in 0..49:
n[i] = i // initialise them to their indexes
nsize = 50 // starting pool size
do 6 times:
i = rnd(nsize) // give a number between 0 and nsize-1
print n[i]
nsize = nsize - 1 // these two lines effectively remove the used number
n[i] = n[nsize]
Просто выберите случайное число из пула, заменив его на верхнее число из этого пула, затем уменьшивразмер пула, вы получаете случайное перемешивание, не беспокоясь о большом количестве перестановок впереди.
Это важно, если число велико, поскольку оно не приводит к ненужной задержке запуска.
Например, рассмотрите следующий бенч-тест, выбрав 10-из-10:
<------ n[] ------>
0 1 2 3 4 5 6 7 8 9 nsize rnd(nsize) output
------------------- ----- ---------- ------
0 1 2 3 4 5 6 7 8 9 10 4 4
0 1 2 3 9 5 6 7 8 9 7 7
0 1 2 3 9 5 6 8 8 2 2
0 1 8 3 9 5 6 7 6 6
0 1 8 3 9 5 6 0 0
5 1 8 3 9 5 2 8
5 1 9 3 4 1 1
5 3 9 3 0 5
9 3 2 1 3
9 1 0 9
Вы можете видеть, как пул сокращается по ходу и потому, что вы всегда заменяете использованный.с неиспользованным, у вас никогда не будет повторения.
Использование результатов, полученных из этого в качестве индексов в вашей коллекции, гарантирует, что дубликат не будетэлементы будут выбраны.