2009-09-22 80 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