方法一:有人用如下代码以记录总数为极大值来首先提取出指定数量的随机数,然后以这些随机数做为记录ID。 VBScript代码: dim n,j dim su() dim a,b,k b=myrs.RecordCount Randomize redim su(index_N) su(1)=Int((b * Rnd) + 1) for n=2 to index_N a=Int((b * Rnd) + 1) for j=1 to n do while a=su(j) a=Int((b* Rnd) + 1) j=1 loop next su(n)=a next 这种方式有一些问题,就是当主键ID不连续的话,有可能某些随机数不存在ID序列当中。另外ID的最大值与总的记录值不一定相等,这样有些记录ID会永远被忽略。 方法二:有人采用一条SQL语句解决此问题 select top 5 * From Table1 order by Rnd()*5 这条语句可以随机从Access数据库中摄取5条记录。但是实际操作中,其生成的记录结果是固定的,失去了随机摄取记录的意义。 方法三:有这样一种方法。 利用随机数生成主键的记录ID yourstr="*1*3*4*6*12*...." 然后用 sql="select top 10 * form yourdb where instr('*'&id&'*','"&yourstr&"')<>0" yourstr 可以生成随机数多一点大于所限定抽取的随机数为好。这样可以排除记录不足的情况。 此方法也不太好,而且采用InStr语句,不能利用索引优化,对资源有一定的消耗。 方法四: 代码实现如下: <% n=10 ''取任意10条记录 set rs = server.CreateObject ("adodb.recordset") sql = "select * from table" rs.open sql,conn,1,1 count=rs.recordcount ''记录总数 IF Count<>empty Then Randomize for i = 1 to n ''循环n次 num=Fix(Rnd*count) ''num便是随机产生的记录行数,用Fix(),使其不会大于count值。 rs.move num ''移到改随机行 Response.write rs(0) ''出该条记录 rs.movefirst ''别忘了再把指针移到第一条 next End IF rs.close set rs = nothing %> 这个方式感觉上比较好些。 方法五: 此方法应该算是比较接近于SQL Server的用法了。 代码: randomize '得到随机的种子,9999根据你的记录数量级调整,具体调到你出来的记录集随机序列均化 seed=round(rnd*9999) '以下两种方法都可以,id是主键自增字段 Sql="select id,分值 from table where order by rnd(-"&seed&"-id-"&seed&")" ……
PS:网上能找到的好像就这些了,我逐一试了下,好像都不好用
直接用rnd(id)在access中运行没问题,但代码中调用不行
SELECT TOP N这种也不行,总是取到固定的那几个
其实多条件也是可以用UNION,但是记录集就不能更新了
用下面代码生成随机ID,还要再结合select in这样子就OK了
Private Function getRndID(zhangjie As Integer, sNum As Integer) As String Dim strID As String Dim i As Integer Randomize rsMDB.Open "select id from shiti where zhangjie=" & Trim$(Str(zhangjie)) & " order by rnd(-(ID+" & Rnd() & "))", connMDB Do While Not rsMDB.EOF i = i + 1 strID = strID & rsMDB("id") & "," rsMDB.MoveNext If i >= sNum Then Exit Do Loop rsMDB.Close getRndID= strID End Function
PS:不清楚怎以回事,上边的代码有时也会不太好用,再附上一段数组随机排序的代码
Private Function XOrder(ByRef OldOrder() As String) As String() '打乱动态数组顺序 Dim NewOrder() As String, i&, j&, k&, kk& k = UBound(OldOrder): ReDim NewOrder(k) Randomize For i = 0 To k - 1 j = Fix(Rnd * (UBound(OldOrder) + 1)) NewOrder(i) = OldOrder(j) kk = UBound(OldOrder) OldOrder(j) = OldOrder(kk) ReDim Preserve OldOrder(kk - 1) Next NewOrder(i) = OldOrder(0) XOrder = NewOrder End Function
ACCESS随机抽题
最新推荐文章于 2021-01-28 06:02:52 发布