Я предполагаю, что здесь приходит мой первый вопрос о SO.PHP - Улучшение генерации последовательности случайных чисел
В настоящее время я работаю над веб-сайтом, и мне нужно сгенерировать 6 номеров от 1 до 29 (по одному на каждый максимум) для лотереи. Поскольку они могут быть в любом порядке, я просто сортирую их потом.
Если я не ошибаюсь, это должно означать, что есть возможные возможные комбинации: (29*28*27*26*25*24)/6! = 475020
.
Я пробовал разные способы генерации последовательностей, используя mt_rand или random_int (от random_compat), но когда я тестирую его с чем-то вроде итераций 10k, я всегда получаю около 100 дубликатов, хотя они похожи на 465k комбинаций доступный.
Вот примеры кода я пытался:
// Using an array and mt_rand (or random_int, giving same results)
// Also tried shuffling the array instead of simply reindexing it, not better
$values = range(1, 29);
while(count($values) > 6) {
unset($values[mt_rand(0, count($values) - 1)]);
$values = array_values($values);
}
// Creating the array from random numbers (same results using random_int)
$values = array();
while (count($values) < 6) {
$r = mt_rand(1, 29);
if (in_array($r, $values)) {
continue;
} else {
$values[] = $r;
}
}
Так хорошо ... Мои вопросы:
- Есть ли способ улучшить то, что я сейчас делаю?
- Это так, как должно быть, и я должен иметь дело с этим?
- Я просто делаю это неправильно?
Спасибо!
Lyn.
PS: Просмотрено много вопросов, но не нашлось ничего, что могло бы заполнить мои потребности, извините, если я не выглядел достаточно хорошо!
Просто, чтобы сделать несколько вещей ясно: Использование random_int (что делает использование/DEV/urandom или openssl_random_pseudo_bytes) не улучшает ничего, что я думал, что будет. И я не хочу использовать внешний API (например, random.org), если это возможно.
'$ numbers = range (1,29) ; перетасовка ($ диапазон); $ draw = array_slice ($ range, 0, 6); echo implode (',' $ draw); '....и вы никогда не получите дубликатов в любой заданной ничьей –
@MarkBaker Параметры метода implode находятся в неправильном порядке. –
@MarkBaker Я не получаю дубликаты в конкретной ничьей, я получаю повторяющиеся розыгрыши. Извините, если это было недостаточно ясно :) – Lynesth