Мне нужно создать уникальные случайные булавки, используя только цифры. Мне нужно произвести от 10 000 000 до 99 999 999. Мне нужно создать 100 000 пинов
Вот код, который я сейчас использую:
function UniqueRandomNumbersWithinRange($min, $max, $quantity) {
$numbers = range($min, $max);
shuffle($numbers);
return array_slice($numbers, 0, $quantity);
}
print_r( UniqueRandomNumbersWithinRange(10000000,99999999,100000));
Этот код все еще работает нормально с моим сервером, используя 50000, но не с 100000 элементов. Можете ли вы помочь мне, есть ли код, который может производить столько уникальных чисел, не используя слишком много памяти на сервере?
Я считаю, что это должно помочь вам:
<?php
function UniqueRandomNumbersWithinRange($min, $max, $quantity) {
$i = 0;
$numbers = array();
while( $i <= $quantity ){
$numbers[$i] = mt_rand($min, $max);
$i++;
}
print_r( $numbers );
}
UniqueRandomNumbersWithinRange(10000000,99999999,100000);
?>
Что касается комментария к моему ответу, существует возможность использования нескольких ключей, содержащих один и тот же пин.
Этот код устраняет дубликаты, но занимает намного больше вычислительного времени:
<?php
function UniqueRandomNumbersWithinRange($min, $max, $quantity) {
$i = 0;
$numbers = array();
while( $i <= $quantity ){
$number = mt_rand( $min, $max );
if( !in_array( $number, $numbers ) ){
$numbers[$i] = $number;
$i++;
}
}
print_r( $numbers );
}
UniqueRandomNumbersWithinRange(10000000,99999999,100000);
?>
range()
использует только много памяти; вы генерируете массив из 90 000 000 int
значения, каждые 8 байт на вашей 64-битной машине. Это делает его массивом 686 МБ.
Поэтому нам нужно сгенерировать каждое число отдельно и проверить, есть ли оно в вашем массиве результатов (чтобы убедиться, что каждое число уникально)
function UniqueRandomNumbersWithinRange($min, $max, $quantity) {
if ($max - $min < $quantity * 10) return false;
$unique_numbers = array();
while (count($unique_numbers) < $quantity) {
$random_number = mt_rand($min, $max);
if (!in_array($random_number, $unique_numbers)) $unique_numbers[] = mt_rand($min, $max);
}
return $unique_numbers;
}
Первая строка внутри функции проверяет, достаточно ли числа между $min
а также $max
доступно, для генерации $quantity
уникальные номера; в противном случае мы получаем бесконечный цикл здесь. Я добавил коэффициент 10, так что есть место для случайности;)
Маленькая идея; сделать диапазон ($ min, $ amount), а затем умножить все сгенерированные числа на количество $ max / $. Это значительно уменьшит ваш массив чисел и все равно будет иметь правильный диапазон.
function UniqueRandomNumbersWithinRange($min, $max, $quantity) {
$numbers = range(0, $quantity);
shuffle($numbers);
array_walk($numbers, function(&$value, $key, $params) {
$value = floor($params[0] + $value * ($params[1]-$params[0]) / $params[2]);
}, array($min, $max, $quantity));
return $numbers;
}
print_r( UniqueRandomNumbersWithinRange(10000000,99999999,100000));