Мне нужно создать большой список случайных чисел от 600 к 2000 тыс., Но список не может иметь дубликатов.
Моя текущая «реализация» выглядит так:
<?php header('Content-type: text/plain'); $startTime = microtime(true); $used = array(); for ($i=0; $i < 600000; ) { $random = mt_rand(); //if (!in_array($random, $used)) { $used[] = $random; $i++; //} } $endTime = microtime(true); $runningTime = $endTime - $startTime; echo 'Running Time: ' . $runningTime; //print_r($used); ?>
Если я хочу, чтобы тест in_array
прокомментировал, время обработки составляет около 1 секунды, поэтому вызовы mt_rand
и заполнение used
массива относительно «дешевы», но когда я раскомментирую тест in_array, возникают плохие вещи! (Я просто жду – это было более 10 минут – для завершения сценария …)
Поэтому я ищу альтернативы либо на стороне обнаружения дубликатов, либо в части генерации (как я могу генерировать случайные числа без риска получения дубликатов)
Я открыт для любого предложения.
Для быстрого / грязного решения, действительно ли использование / проверка ключей массива улучшает вашу скорость вообще?
$used = array(); for ($i = 0; $i < 600000; ) { $random = mt_rand(); if (!isset($used[$random])) { $used[$random] = $random; $i++; } } $used = array_values($used);
in_array
требует поиска всего массива в худшем случае, что означает линейные затраты ( O ( n )). Но используя ключ массива как-ну – ключ, затраты постоянны ( O (1)), так как затраты на доступ к массиву всегда постоянны.
Например, вы можете сделать что-то подобное
$random = mt_rand(); $array = range($random, $random + 600000); $array = shuffle($array);
Это создало бы массив, который сначала в порядке, но затем он перемещает массив, поэтому значения будут случайными. Никаких столкновений! : D
Если вы все равно зацикливаете, и если вам не нужно больше 600000, почему бы вам вообще их проверить, почему бы просто не добавить $ i к $ random. сделанный. не достаточно случайный?
for ($i = 0; $i < 600000; $i++) { $yourArray[] = mt_rand() . $i; }
Кроме того, существует массив array_unique, который удаляет повторяющиеся значения из массива.