生成从10000000到99999999的唯一随机数


Generating unique random numbers from 10000000 to 99999999

我需要只使用数字创建唯一的随机引脚。我需要生产10000000到99999999之间的产品。我需要创建100000针

这是我目前使用的代码:

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

根据对我的回答的评论,有可能有多个键包含同一个pin。此代码将消除重复,但需要更多的计算时间:

<?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()使用的内存太多;您生成了一个由90000000个int值组成的数组,每个值在64位机器上有8个字节大。这使它成为一个686 MB的阵列。

因此,我们需要自己生成每个数字,并检查它是否已经在您的结果数组中(以确保每个数字都是唯一的)

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,$quantity),然后将所有生成的数字乘以$max/$quantitue。这将大大减少您的$numbers数组,并且仍然具有正确的范围。

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