2014-10-01 134 views
3

我需要使用数字创建唯一的随机引脚。我需要生产10,000,000到99,999,999之间。我需要创造10万针从10000000到99999999生成唯一的随机数

这里是我目前使用的代码:

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个物品仍然运行还好我的服务器。你能帮助我吗?是否有代码可以产生这么多独特的数字,而不会在服务器中使用太多内存?

+0

您可以先生成随机数字的数量,然后在0-9之间随机化一个数字,次数为 – 2014-10-01 09:24:06

+0

摆脱“ $ numbers = range($ min,$ max);'开始。测试每个兰特是否已经在结果数组中,直到达到您的数量为止 – 2014-10-01 09:27:12

+1

http://www.php.net/mt_rand – GordonM 2014-10-01 09:27:59

回答

1

我相信这应该为你做的伎俩:

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

至于我的答案注释的,存在包含相同的引脚多个按键的posibility。 此代码将消除重复,但需要更多的计算时间:

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

编辑我的答案以包含避免重复的可能性。 – 2014-10-01 09:40:54

+0

嗨,奥莱,谢谢你这两个代码工作得很好..谢谢! – LayoutPH 2014-10-01 09:54:23

+0

分配'$ numbers [$ number] = true;'和'return array_keys($ numbers)' - ' - 我不确定,但我相当肯定'isset($ numbers [$数字])'比'in_array($ number,$ numbers)'快得多。 – 2014-10-01 11:56:10

0

小想法;做一个范围($ min,$ quantity),然后将所有生成的数字乘以$ max/$ quantity。这将大大减少你的$数组数组,并仍然有正确的范围。

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

不确定速度,但你至少不会需要两个级联循环来检查所有结果的唯一性。 – ToBe 2014-10-01 09:36:39

+0

谢谢先生,但它只是给我一个白色的屏幕,它没有运行。 – LayoutPH 2014-10-01 09:55:11

+0

已修复。数学天才可能希望查看它,但对我来说似乎是正确的。 – ToBe 2014-10-01 11:53:06

0

range()只使用很多内存;您将生成90,000,000个int值的数组,每个8位字节在您的64位计算机上很大。这使得它成为686MB的阵列。

所以我们需要生成它自己的每个数字和检查,如果它已经在你的结果阵列(以确保每一个号是唯一的)

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的因子,所以有一些随机性的空间;)