Генерация уникальных случайных чисел от 10000000 до 99999999

Мне нужно создать уникальные случайные булавки, используя только цифры. Мне нужно произвести от 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 элементов. Можете ли вы помочь мне, есть ли код, который может производить столько уникальных чисел, не используя слишком много памяти на сервере?

3

Решение

Я считаю, что это должно помочь вам:

<?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);
?>
1

Другие решения

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, так что есть место для случайности;)

0

Маленькая идея; сделать диапазон ($ 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));
0
По вопросам рекламы [email protected]