2009-09-22 77 views
3

我需要從600k到2000k生成一個大的隨機數列表,但 列表不能有重複。php in_array替代大數組避免重複條目

我目前的「執行」看起來是這樣的:

<?php 
    header('Content-type: text/plain'); 
    $startTime = microtime(true); 
    $used = array(); 
    for ($i=0; $i < 600000;) { 
     $random = mt_rand(); 
     //if (!in_array($random, $used)) { 
     $used[] = $random; 
     $i++; 
     //} 
    } 
    $endTime = microtime(true); 
    $runningTime = $endTime - $startTime; 
    echo 'Running Time: ' . $runningTime; 
    //print_r($used); 
?> 

如果我把in_array測試評價處理時間爲1秒左右,所以 的mt_rand調用和used陣列填充相對「便宜」但是當我取消註釋 in_array測試不好的事情發生! (我只是在等待 - 它已經超過10分鐘了 - 腳本終止了......)

所以我正在尋找替代品在重複檢測或生成部分(我怎麼能生成隨機數字沒有獲得重複的風險)

我願意接受任何建議。

回答

15

對於一個快速/骯髒的解決方案,並使用/檢查數組鍵提高你的速度呢?

$used = array(); 
for ($i = 0; $i < 600000;) { 
    $random = mt_rand(); 
    if (!isset($used[$random])) { 
     $used[$random] = $random; 
     $i++; 
    } 
} 
$used = array_values($used); 
+0

謝謝!運行時間的差異非常大!即使運行循環2000k次。它閃電般快! – Cesar 2009-09-22 06:59:40

+0

+1。這種方式很好,因爲in_array不僅運行速度慢,而且還會記憶。在減少了大約20個案例,並且從in_array中刪除了所有這些案例之後,我在關鍵資源上節省了1.2MB內存,服務於2500萬用戶。 – 2012-10-30 07:47:23

1

如果你這樣做了,反正循環和如果你不需要超過60萬以上,爲什麼你會檢查他們在所有的,爲什麼不追加$ I至$隨機的。完成。不夠隨機?

for ($i = 0; $i < 600000; $i++) 
{ 
    $yourArray[] = mt_rand() . $i; 
} 

此外還有數組函數array_unique,它從數組中刪除重複值。

5

in_array需要搜索在最壞情況下整個陣列,這意味着線性成本(øÑ))。但是使用陣列密鑰作爲密鑰,成本是不變的(O(1)),因爲數組訪問的開銷總是恆定的。

2

例如,你可以做這樣的事情,而不是

$random = mt_rand(); 

$array = range($random, $random + 600000); 

$array = shuffle($array); 

這將創建一個數組,首先是爲了,但隨後慢騰騰的陣列,所以值將是隨機的。沒有碰撞! :D