1. 论坛系统升级为Xenforo,欢迎大家测试!
    排除公告

寻求更优的随机方案

本帖由 Tameway2006-01-10 发布。版面名称:新人报道

  1. Tameway

    Tameway New Member

    注册:
    2005-09-06
    帖子:
    1,286
    赞:
    8
    问题如下:

    数据库中有一个表table
    表中有四条固定的记录,ID=1 2 3 4
    这四条记录不会删改也不会再增加别的记录

    现在想按随机顺序读取这四条记录(不是随机读取一条,是按随机顺序读取四条)
    比如第一次读取 2 4 1 3
    刷新一下后读取的是 3 2 4 1
    如此如此。。。。

    我的想法是,利用随机函数产生1-4中的一个数字,读取出对应的ID记录,然后循环产生第二个1-4之间的数字,如果对应的ID已经被读取,就再重新随机生成一次。

    但是老感觉这样的算法不是稳定的,万一运气不好生成了一万次也生成不出某一个数字,那程序岂不就没法运行了?

    寻求其他方案
     
  2. 不学无术

    不学无术 Ulysses 的元神

    注册:
    2005-08-31
    帖子:
    16,714
    赞:
    39
    4 * 3 * 2 * 1 = 24,总共 24 中排列。你把可能的排列都列出来,随机挑选一组咯。

    :)
     
  3. Tameway

    Tameway New Member

    注册:
    2005-09-06
    帖子:
    1,286
    赞:
    8
    。。。。。

    四只是打个比方,实际的表里有32条记录

    32*31*30*29*28*.....*3*2*1 = ????
     
  4. 老林

    老林 New Member

    注册:
    2005-09-06
    帖子:
    10,580
    赞:
    36
    Sql server:

    select top 4 * from 表 order by newid()

    Access:

    SELECT top 4 * FROM 表 ORDER BY Rnd(id)
     
  5. 不学无术

    不学无术 Ulysses 的元神

    注册:
    2005-08-31
    帖子:
    16,714
    赞:
    39

    说实话,还是没看明白这两句 SQL 的原理。

    newid() 和 Rnd(id) 的效果是什么?

    Rnd(id) 是指将 id 随机显示,也就是不按照 ASC 也不按照 DESC ?

    MS SQL 帮助文档中

    要学习的东西太多了。

    :(
     
  6. Tameway

    Tameway New Member

    注册:
    2005-09-06
    帖子:
    1,286
    赞:
    8

    我真的老了,竟然不知道这个办法。。。。
     
  7. flyinghail

    flyinghail New Member

    注册:
    2005-11-08
    帖子:
    13
    赞:
    0
    MySQL:
    SELECT * FROM table ORDER BY RAND()