疯了,要生成1亿个10位的随机数字 要求是无重复的有快一点的办法么?我现在是每生成一个 就要跟前面的已经生成的比较。到了后面超级慢求个好办法。。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 参考: http://www.cppblog.com/pengkuny/archive/2006/11/12/15057.html <?phpfunction foo($len=4) { $s = chunk_split('0123456789',1); $ar = split("[\r\n]+",$s); array_pop($ar); shuffle($ar); return join('',array_slice($ar,rand(0,count($ar)-$len),$len)); } echo foo(9).'<br>'; echo foo(9).'<br>';?>这是唠叨老大写的,我觉得很经典 我觉得是不是可以这样: for($i=1;$i<100000000;$i++){ $str=md5("自定义一个字符串".$i); $num=changeToNum($str); ... ...} changeToNum($str)是把字符转换成数字该方法主要是利用md5的散列特性,但是转换成数字后有可能破坏这种特性,所以数字长度需要足够长,这样重复的几率就很小。以上方法未经试验,有待研究和讨论 to mfzhao(往来之间,光明无限!) :呵呵,唠叨写的好像麻烦点了。你看看str_shuffle函数 to mfzhao(往来之间,光明无限!) :方法是不错,但是保证不了1亿之间不重复,虽然重复得概率是1/10^10,但是还是有重复得可能!楼主要的是不重复的,这点唠叨老大的方法得不到保证!另外确实还是像 zairwolfc(君子兰) 说得那样,直接用str_shuffle就可以将字符串得顺序打乱的! $M = 100000000;$N = 1000000000;for($i = 0; $i < 9 * $N; $i++){$a[$i] = $i + $N;}$rand_keys = array_rand($a, $M);for($i = 0; $i < $M; $i ++){echo $a[$rand_keys[$i]];} 用数据库做,可以设成主健,插不进去,忽略之。也可以一次生成 > 1 亿个,保存于表中,然后用 select top 1 亿 disctinct 取前1亿个不重复的。 完全SQL实现.http://www.cnblogs.com/adandelion/articles/542534.html 用程序做要生成一个10亿的位图来保存已经生成的数用每个二进制位表示一个数这个图有1G多大PHP直接用整形处理不了四字节以上的数应该考虑分段生成在数据库里的整形可以设置成非常大,数据库引擎会有非常优化的排序算法来查重,可以直接在数据库里做,设置成键值 lz的思路出了问题,直接用sql生成会快好多,可以到sql区看看邹健生成百万随机数的例子,摘录一下:USE tempdbGOCREATE TABLE tb(id char(8))CREATE UNIQUE INDEX IX_tb ON tb(id)WITH IGNORE_DUP_KEYGODECLARE @dt datetimeSET @dt = GETDATE()SET NOCOUNT ONDECLARE @row intSET @row = 1000000WHILE @row >0BEGINRAISERROR('need %d rows', 10, 1, @row) WITH NOWAITSET ROWCOUNT @rowINSERT tb SELECTid = RIGHT(100000000 + CONVERT(bigint, ABS(CHECKSUM(NEWID()))), 8)FROM syscolumns c1, syscolumns c2SET @row = @row - @@ROWCOUNTENDSELECT BeginDate = @dt, EndDate = GETDATE(), Second = DATEDIFF(Second, @dt, GETDATE())GOSELECT COUNT(*) FROM tbGODROP TABLE tbTop 回复人:zjcxc(邹建) ( 四级钻石) 信誉:673 2006-8-19 19:57:22 得分:0? 测试结果:BeginDate EndDate Second2006-08-19 19:55:01.8902006-08-19 19:56:02.06061比楼主的快多了, 我生成100万只用了1分钟原文地址:http://community.csdn.net/Expert/TopicView3.asp?id=4960404 <?$randar=Array();//存放随机数的数组$range=9999999999;//随机数范围0~9999999999function RandNum(&$randar,&$range){ $v=$t=rand(0,$range); $v = isset($randar[$v])?$randar[$v]:$v; $randar[$t] = isset($randar[$range])?$randar[$range]:$range; unset($randar[$range]); $range--; return substr("0000000000".$v,-10);} 上面应该没有重复了,不过好像要把$randar,$range设置为全局变量 1Y,要是用数组存,NND,这得耗费多大的内存啊。 $randar=Array();这样只是申请一个数组吧$randar[$t] = isset($randar[$range])?$randar[$range]:$range;==========================================================只有在这个时候才会向数组添加数据unset($randar[$range]);======================不用的就释放掉而且不用搜索,直接取到的 关于用php mail函数发送带附件的邮件 php多个文件怎么调试啊 小女子问个mysql视图问题 招聘熟悉MySQL+PHP的兼职作者 paypal是不是不能放在iframe里 PHP怎么判断上一页来源? PHP网站中如何处理字符串字符,以及对安全的影响,内附函数,大侠请指点。 怎样过滤去html中诸如<table>等的各种控制符? jquery ajax 自动补全 用php怎样做多线程的方法 如何修改discuz论坛,已使主站与论坛的用户统一? 关于shmop_open()的问题
http://www.cppblog.com/pengkuny/archive/2006/11/12/15057.html
function foo($len=4) {
$s = chunk_split('0123456789',1);
$ar = split("[\r\n]+",$s);
array_pop($ar);
shuffle($ar);
return join('',array_slice($ar,rand(0,count($ar)-$len),$len));
}
echo foo(9).'<br>';
echo foo(9).'<br>';
?>
这是唠叨老大写的,我觉得很经典
for($i=1;$i<100000000;$i++){
$str=md5("自定义一个字符串".$i);
$num=changeToNum($str);
... ...
} changeToNum($str)是把字符转换成数字
该方法主要是利用md5的散列特性,但是转换成数字后有可能破坏这种特性,所以数字长度需要足够长,这样重复的几率就很小。以上方法未经试验,有待研究和讨论
$N = 1000000000;
for($i = 0; $i < 9 * $N; $i++)
{
$a[$i] = $i + $N;
}
$rand_keys = array_rand($a, $M);
for($i = 0; $i < $M; $i ++)
{
echo $a[$rand_keys[$i]];
}
可以设成主健,插不进去,忽略之。
也可以一次生成 > 1 亿个,保存于表中,
然后用 select top 1 亿 disctinct 取前1亿个不重复的。
http://www.cnblogs.com/adandelion/articles/542534.html
可以到sql区看看邹健生成百万随机数的例子,摘录一下:USE tempdb
GOCREATE TABLE tb(id char(8))
CREATE UNIQUE INDEX IX_tb ON tb(id)
WITH IGNORE_DUP_KEY
GODECLARE @dt datetime
SET @dt = GETDATE()
SET NOCOUNT ON
DECLARE @row int
SET @row = 1000000
WHILE @row >0
BEGIN
RAISERROR('need %d rows', 10, 1, @row) WITH NOWAIT
SET ROWCOUNT @row
INSERT tb SELECT
id = RIGHT(100000000 + CONVERT(bigint, ABS(CHECKSUM(NEWID()))), 8)
FROM syscolumns c1, syscolumns c2
SET @row = @row - @@ROWCOUNT
END
SELECT BeginDate = @dt, EndDate = GETDATE(), Second = DATEDIFF(Second, @dt, GETDATE())
GOSELECT COUNT(*) FROM tb
GODROP TABLE tb
Top
回复人:zjcxc(邹建) ( 四级钻石) 信誉:673 2006-8-19 19:57:22 得分:0
? 测试结果:BeginDate EndDate Second
2006-08-19 19:55:01.8902006-08-19 19:56:02.06061
比楼主的快多了, 我生成100万只用了1分钟原文地址:
http://community.csdn.net/Expert/TopicView3.asp?id=4960404
$randar=Array();//存放随机数的数组
$range=9999999999;//随机数范围0~9999999999
function RandNum(&$randar,&$range)
{
$v=$t=rand(0,$range);
$v = isset($randar[$v])?$randar[$v]:$v;
$randar[$t] = isset($randar[$range])?$randar[$range]:$range;
unset($randar[$range]);
$range--;
return substr("0000000000".$v,-10);
}
$randar,$range
设置为全局变量
这样只是申请一个数组吧
$randar[$t] = isset($randar[$range])?$randar[$range]:$range;
==========================================================
只有在这个时候才会向数组添加数据unset($randar[$range]);
======================
不用的就释放掉而且不用搜索,直接取到的