php 2000 1000到9999之间的唯一随机数

时间:2014-04-30 08:30:15

标签: php random numbers

我想在1000到9999之间生成2000个唯一的随机数。 我正在做这样的事情,但它没有产生唯一的数字。

$numbers = array();             

// Loop while there aren't enough numbers
while (count($numbers) < 2000) {

    $random_number = rand(1000, 9999);

    if (!in_array($random_number, $numbers)) {             
       // This adds the number to the array      
       $numbers[] = 'A'.$random_number.'14';
    }

}

请帮忙。

7 个答案:

答案 0 :(得分:12)

对于像这样的小范围而不是运行许多随机尝试,我宁愿使用这种方法:

$candidates = range(1000, 9999);
shuffle($candidates);
$numbers = array_slice($candidates, 0, 2000);
$numbers = array_map(function ($number) { return "A{$number}14"; }, $numbers);

答案 1 :(得分:3)

您检查号码的存在,例如4567,但是您添加了'A456714',因此您无法找到该号码。

你可以这样解决:

$numbers = array();             

// Loop while there aren't enough numbers
while (count($numbers) < 2000) {

    $random_number = rand(1000, 9999);

    $code = 'A'.$random_number.'14';

    if (!in_array($code, $numbers)) {             
       // This adds the number to the array      
       $numbers[] = $code;
    }

}

我必须说,deceze的解决方案也非常好(实际上更好)。不同的是,在他的解决方案中,你根本没有任何双重数字来检查,所以在大多数情况下它可能会更快。

缺点是你将拥有一个拥有9000个数字的相对较大的阵列。对于这种特定情况,他的解决方案甚至可能更好,但如果您选择较小数量的随机数,或者从较大范围选择,这个(您自己的)解决方案可能会更好。如果你想从range(100, 1000000)中选择100个随机数,那么这个解决方案可能会更好,因为选择一个双数的机会非常小并且检查它非常轻量级。

很难说出引爆点在哪里,但对于你目前的情况,我会选择他的。

答案 2 :(得分:1)

不是检查数组是否已存在该数字,而是尝试:

<?php

$numbers=array();

while (count($numbers)<2000)
{
    $numbers['A'.rand(1000,9999).'14']=true;
}

$unique=array_keys($numbers);

echo print_r($unique,true).PHP_EOL;

它使用数组键是唯一的,以删除数组检查。我猜想计算数组中元素的数量要快得多

答案 3 :(得分:0)

这是因为您为要放入数组$ numbers的每个数字添加了A和14 .. 那么,你生成的每个数字的下一个循环都不会有任何相同的数字..

抱歉我的英语不好..

答案 4 :(得分:0)

random.org API:

$numbers = explode(PHP_EOL,
    file_get_contents(
        'http://www.random.org/integers/?num=2000&min=1000&max=9999&col=1&base=10&format=plain&rnd=new'
    )
);


$numbers = array_map(function($v) {
    return 'A' . $v . '14';
}, $numbers);

答案 5 :(得分:0)

function random_in_rang($min, $max, $count)
{
    $numbers = array();
    for($i=0; $i<$count; $i++)
    {
        //decrease range after adding a new random value
        $rnd = rand($min, $max-$count);
        //new value should be unique
        while(isset($numbers[$rnd])) $rnd++;
    }
    return array_keys($numbers);
}

答案 6 :(得分:0)

对于大范围的更有效的方式(对于速度和内存使用):

function get_unique_random_numbers($min,$max,$count) {
    $numbers = array();
    while( count($numbers) < $count ) {
          $numbers["A".mt_rand($min,$max)."14"] = 1;
    }
    return array_keys($numbers);
}

$numbers = get_unique_random_numbers(0,90000000,20000);
// < 0.X seconds

($max-$min) >> $count时此方法更有效。 但是($max-$min) ~ $count时它很慢。 它在($max-$min) < $count时会产生无限循环。

所以要小心。 :)最后在开始循环之前进行检查。