2014-10-01 138 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的因子,所以有一些隨機性的空間;)