2017-03-22 101 views
-2

我要生成使用PHP億個整數,但我的代碼太慢運行:生成億個隨機整數有效

<?php 
$arr=array(); 
while(count($arr)<10000) 
{ 
    $arr[]=rand(1,10000); 
    $arr=array_unique($arr); 
} 
echo implode(" ",$arr); 
?> 

我怎麼可能提高呢?

+0

我不能讓它跑,疲憊不堪內存即使我增加memory_limit,但'$ arr = range(1,100000000); shuffle($ arr);' – AbraCadaver

+0

@AbraCadaver自己也得出同樣的結論。我嘗試了高達1,000,000,但更多零點吹響了記憶。當然,它在短時間內完成了這項工作。你應該評論一個答案。 – Manngo

+0

也許這個數字太多了,我編輯它,我怎麼能改進它? – HAO

回答

0

100,000,000但是,在我的電腦上(英特爾酷睿i5-3320M 2.6GHz,8GB內存,Windows 7 64位),使用PHP 7.1.3的數字非常雄心勃勃,不太現實,比5.x),你的循環跑了約8 hours之前,我殺了它。只有10,000它運行在1596 seconds,即27 minutes

除了迭代次數外,主要問題是array_unique()。每次迭代需要花費時間在不斷增加的有時巨大的陣列上運行,並且可能會刪除需要重新生成的項目。

我試圖通過使用數字作爲關鍵的更好的方法來避免重複。有一個memory_limit7G(很少,它死於一個致命錯誤內存不足),它運行在1018 seconds,這就是17 minutes。只有10,000它運行在.0035 seconds:在21 seconds550M一個memory_limit

ini_set('memory_limit', '7G'); 

$arr = array(); 
while(count($arr) < 100000000) 
{ 
    $num = rand(1, 100000000); 
    $arr[$num] = $num; 
} 

下運行(更何況,並將其與致命錯誤去世了內存)。只有10,000它運行在.0005 seconds並且不需要高於我的默認值128M的內存。

讓PHP爲你創建一個範圍(唯一),然後洗牌(隨機化)。現在你有一個隨機的順序所有的號碼,而無需生成它們一個接一個,消除重複併產生更多:

ini_set('memory_limit', '550M'); 

$arr = range(1, 10000000); 
shuffle($arr); 
+0

謝謝,這對我很有幫助 – HAO