在PHP中创建10000个不重复的随机数

在PHP中创建10000个不重复的随机数,php,random,Php,Random,我需要找到一种方法,在PHP中创建10000个不重复的随机数,然后将其放入数据库表中。数字长度为12位 做这件事的最好方法是什么?12位长,我认为重复的可能性不大。我可能只会生成数字,尝试将它们插入表中,如果它已经存在(假设您对该列有唯一的约束),则只需生成另一个数字。这假设您可以生成一个12位数的随机数而不会出现问题(使用getrandmax()根据一些系统上的php.net,32k是一个尽可能大的数字 $array = array(); while(sizeof($array)<=1

我需要找到一种方法,在PHP中创建10000个不重复的随机数,然后将其放入数据库表中。数字长度为12位


做这件事的最好方法是什么?

12位长,我认为重复的可能性不大。我可能只会生成数字,尝试将它们插入表中,如果它已经存在(假设您对该列有唯一的约束),则只需生成另一个数字。

这假设您可以生成一个12位数的随机数而不会出现问题(使用getrandmax()根据一些系统上的php.net,32k是一个尽可能大的数字

$array = array();

while(sizeof($array)<=10000){
  $number = mt_rand(0,999999999999);
  if(!array_key_exists($number,$array)){
     $array[$number] = null;
  }
}

foreach($array as $key=>$val){
  //write array records to db.
}
$array=array();
while(sizeof($array)$val){
//将数组记录写入数据库。
}

您可以使用rand()或mt_rand()。mt_rand()但是应该更快。

生成10000个随机数并将它们放入一个数组中。通过
array\u unique
运行数组。检查长度。如果小于10000,则添加一堆。通过
array\u unique
运行数组。如果大于10000,则通过
array\u slice
运行数组以获得10000。其他WIse、起泡、冲洗、重复。

立即从
/dev/random
读取例如40000(=PHP\u INT\u SIZE*10000)字节,然后将其拆分、模块化(即
%
操作符),就有了它

然后对其进行过滤,并重复该过程

这避免了太多的系统调用/上下文切换(在php运行时、zend引擎和操作系统本身之间-我不打算在这里深入讨论细节)


这应该是最有效的方法。

不需要在数组()中执行
,这会随着要生成的数字数量的增加而减慢速度。只需将数字用作数组键,这将减少重复检查到
if isset($array[$number]){…}
在数组中
我认为需要线性时间,所以这个整体算法需要二次时间。通过说
$array[$number]=null;
并使用
数组键\u exists
,您应该有更好的性能(接近线性)。我更新了上面的代码以反映使用了@Marc B的建议和@erisco的建议。我猜“做这件事的最佳方式是什么?”实际上,你并不想要最好的方法,因为这里有更好的答案,你只想得到代码而不考虑你的问题。你注定会无知,孩子。代码目前是非函数的。数组的第二个参数需要是数组,而不是值。foreach也需要修改以获得键而不是值(不过,使用数组_键可能是最好的)。或者可能是使用我很无聊,所以我想看看它有多大可能。甚至不太可能。最大随机数约为20亿。我生成了大约100万个随机数,没有发生一次冲突。我在实现之前就耗尽了内存。+1-我喜欢使用
/dev/random
。我唯一关心的是portabi很明显,它在windows上不起作用,如果有一个有效的
open\u basedir
限制,它也可能不起作用。我同意。问题没有提到任何限制,所以我有“我的房间”。实际上以前从来没有必要这样做,将一个四字节块转换为int(在PHP中,就是这样)的最干净的方法是什么?
unpack()
是一个不错的选择。正如你所能想象的,我的方法会一直保持性能。你有中继器,所以在PHP运行时没有循环,循环是由CPU“直接”(通过PHP二进制)完成的。@Flavius Sweet,我不知道这个函数。