如何高效的将5万个不同的随机数插入到数据库中?

字体: | 打印

高手们好:请教一个问题,

     我现在有一个需求:我现在需要生成5万个不同数据使用(mt_rand方法),然后插入到数据库中,以备后来使用。


现在的问题是:(1)   5万个数据,很多。放在数组中的话,占用内存很大,甚至内存不够用;
(2)如果不放入数组中的话,如何保证这5万个数据互不相同?

请高手指点。谢谢。

我也来说两句 查看全部评论 相关评论

  • programmerhuang (2008-7-02 12:01:44)

    5万个还不至于不够用吧. 呵呵
    说说我的想法, 我没试过, 你可以试试
    你可以直接插入5万个连续的数,
    然后使用update结合RAND()函数, 再随机交换两条记录
    但这种方法可能会比较慢.

    也可以使用文件做为存放数据, 其后在文件中打乱顺序, 再放入数据库.
  • beilee80 (2008-7-02 14:09:21)

    你可以建个临时表table,两个字段:id(自增),value(字符串)

    循环5万次 "insert into table (value) values (md5('".microtime()."'))"

    insert into maintable (num) select id from table order by value
  • changanti (2008-7-02 15:29:39)

    php不是有个默认允许使用的最大内存嘛。
    循环5万次 是不是有点夸张了?这个会不会很慢?

    beilee80  说的建个临时表是什么意思?和我实际用的表有什么关系?

    谢谢。
  • beilee80 (2008-7-02 15:42:13)

    就是通过排序后的临时表向主表中插入记录,因为按value排序后的记录的ID随机的,所以最终你的主表中记录的num也是随机的。

    [ 本帖最后由 beilee80 于 2008-7-2 15:45 编辑 ]
  • changanti (2008-7-02 16:03:04)

    这个临时表是从哪里来的?如何建立?
    另外,(1)随机数我只能是用mt_rand函数生成,(2)生成数量比较多(比如说5万个)  (3)不能重复。

    再请beilee80   解释。谢谢。
  • beilee80 (2008-7-02 16:14:15)

    被你问得头晕晕的。。。

    我不太明白为什么你的随机数一定要使用mt_rand生成,你要生成的随机数是不是连续的?比如1-50000,或者2-50001,如果不是连续的,那我的那个方法不行,你就不用往下看了。

    既然是连续的,那么往一个空的临时表中插入50000条记录,是不是可以得到50000个不重复的ID值。

    同时这个临时表中的每条记录有一个md5过的随机字符串。

    你按这个随机字符串排序后,这些ID值不就是无序的了吗,然后再通过一条insert语句不就可以写入到你的主表中了。
  • fhjr999 (2008-7-02 16:55:13)

    事实证明,这样来生成5万个不同的随即码,效率还是很高的,数组的大小限制也完全足够应付了。



    不包括插入数据库部分,执行时间仅为0.1秒,而且我用的还是一台破电脑,效率还是很高的。
    代码有一个逻辑错误,已经改过来了,疏忽了。$i应该从1起始,小于等于50000

    [ 本帖最后由 fhjr999 于 2008-7-2 17:44 编辑 ]
  • kts2tt (2008-7-02 17:23:41)

    LS的如何保证随机数的不重复?
  • fhjr999 (2008-7-02 17:45:56)


    这样可能出现重复的吗???
  • fhjr999 (2008-7-02 17:46:34)

    仔细看下代码你就知道是如何保证不重复的了。
  • kts2tt (2008-7-02 17:49:56)

    。。。。。
    看走行了。。。。

    [ 本帖最后由 kts2tt 于 2008-7-2 17:52 编辑 ]
  • programmerhuang (2008-7-02 17:56:02)

    简单一些
  • cqyd505 (2008-7-02 18:20:40)

    你这代码我用时1.702507019043!
  • slawdan (2008-7-02 18:51:19)

    来个写法简单,但是速度和内存都很差的,哈哈

  • fhjr999 (2008-7-02 19:12:38)

    QUOTE:

    原帖由 cqyd505 于 2008-7-2 18:20 发表
    你这代码我用时1.702507019043!
    不是吧,我的电脑就已经够烂的了
    我又测试了一下,还是0.1秒。
    如果将计算结束时间的那条语句,移到最后,则是0.17秒左右。

    [ 本帖最后由 fhjr999 于 2008-7-2 19:17 编辑 ]
  • fhjr999 (2008-7-02 19:19:31)

    QUOTE:

    原帖由 programmerhuang 于 2008-7-2 17:56 发表
    简单一些

    $randArray = array(0);
    for($i=1; $i
    这个看不懂啊,能解释下吗???
  • programmerhuang (2008-7-02 19:33:49)

    其实要随机不重复的数据, 一般是创建一组不重复的数据(大多是连续的)
    然后用随机数去打乱这组数据.
    完整一点的方法就是

    上面的算法是O(2n), 我把两个循环整合起来, 就成了O(n)了
    也就是上面的算法:
  • fhjr999 (2008-7-02 19:42:16)

    我明白14楼那位兄弟执行起来效率那么差的原因了。
    $min与$max如果之间差距比较小的话,比如就是50000,那么程序执行到后期,很可能需要无数个do while才能确定一个随机码是不重复的,这样自然会效率低下。
    我这种方式只适合$min和$max比较大的情况,这样出现重复随机码的几率比较小。

    [ 本帖最后由 fhjr999 于 2008-7-2 19:46 编辑 ]
  • zshtom (2008-7-02 23:10:53)

    我有一个好玩的想法  楼主没有要求数字的范围 是要是50000个数字 不重复  试想  我 1 2  取一个 3 4取一个 到100000 一定有 50000个不一样 不用数组就搞定了。。。 不用浪费内存。。。。
  • lucas1860 (2008-7-03 08:53:00)

    999的代码0.56406307220459秒到0.7之间