我想在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';
}
}
请帮忙。
答案 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
时会产生无限循环。
所以要小心。 :)最后在开始循环之前进行检查。