要求是无重复的
有快一点的办法么?
我现在是每生成一个 就要跟前面的已经生成的比较。
到了后面超级慢
求个好办法。。

解决方案 »

  1.   

    参考: 
    http://www.cppblog.com/pengkuny/archive/2006/11/12/15057.html
      

  2.   

    <?php
    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>';
    ?>
    这是唠叨老大写的,我觉得很经典
      

  3.   

    我觉得是不是可以这样:
     
    for($i=1;$i<100000000;$i++){
     $str=md5("自定义一个字符串".$i);
     $num=changeToNum($str);
     ... ...
    } changeToNum($str)是把字符转换成数字
    该方法主要是利用md5的散列特性,但是转换成数字后有可能破坏这种特性,所以数字长度需要足够长,这样重复的几率就很小。以上方法未经试验,有待研究和讨论
      

  4.   

    to   mfzhao(往来之间,光明无限!) :呵呵,唠叨写的好像麻烦点了。你看看str_shuffle函数
      

  5.   

    to   mfzhao(往来之间,光明无限!) :方法是不错,但是保证不了1亿之间不重复,虽然重复得概率是1/10^10,但是还是有重复得可能!楼主要的是不重复的,这点唠叨老大的方法得不到保证!另外确实还是像 zairwolfc(君子兰) 说得那样,直接用str_shuffle就可以将字符串得顺序打乱的!
      

  6.   

    $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]];
    }
      

  7.   

    用数据库做,
    可以设成主健,插不进去,忽略之。
    也可以一次生成 > 1 亿个,保存于表中,
    然后用 select top 1 亿 disctinct  取前1亿个不重复的。
      

  8.   

    完全SQL实现.
    http://www.cnblogs.com/adandelion/articles/542534.html
      

  9.   

    用程序做要生成一个10亿的位图来保存已经生成的数用每个二进制位表示一个数这个图有1G多大PHP直接用整形处理不了四字节以上的数应该考虑分段生成在数据库里的整形可以设置成非常大,数据库引擎会有非常优化的排序算法来查重,可以直接在数据库里做,设置成键值
      

  10.   

    lz的思路出了问题,直接用sql生成会快好多,
    可以到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
      

  11.   

    <?
    $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);
    }
      

  12.   

    上面应该没有重复了,不过好像要把
    $randar,$range
    设置为全局变量
      

  13.   

    1Y,要是用数组存,NND,这得耗费多大的内存啊。
      

  14.   

    $randar=Array();
    这样只是申请一个数组吧
    $randar[$t] = isset($randar[$range])?$randar[$range]:$range;
    ==========================================================
    只有在这个时候才会向数组添加数据unset($randar[$range]);
    ======================
    不用的就释放掉而且不用搜索,直接取到的