Access查询生成抽奖用唯一不重复固定随机数相关问题咨询
解决Access查询生成唯一固定随机数(抽奖场景)方案
问题根源说明
你当前遇到的两个问题根源如下:
- Rnd函数传入重复的[Employee ID]作为种子时,会生成完全相同的随机数,因此出现重复值
- 查询中的计算字段每次触发界面刷新(排序、点击记录、切换视图)都会重新执行计算,因此数值会动态变化
最优解决方案(推荐,完全解决两个问题)
要同时解决重复和数值变动的问题,需要将生成的随机数固化存储到表的实字段中,不要使用查询计算字段:
- 打开你的原始表设计视图,新增一个长整型字段,命名为
LotteryNumber,用于存储最终抽奖号码 - 按
Alt+F11打开VBA编辑器,插入新模块,粘贴以下代码:
Sub GenerateUniqueLotteryNumbers() Dim rs As Recordset Dim existingNums As Collection Dim maxNum As Long Dim randomNum As Long ' 请将两处"你的表名"替换为你实际的表名称 Set rs = CurrentDb.OpenRecordset("你的表名", dbOpenDynaset) ' 最大随机数设置为表总记录数,匹配你要的0到列表长度范围需求 maxNum = DCount("*", "你的表名") Set existingNums = New Collection rs.MoveFirst Do While Not rs.EOF ' 循环生成直到得到不重复的随机数 Do Randomize Timer ' 如果需要范围包含0,删掉末尾的+1即可 randomNum = Int(Rnd * maxNum) + 1 On Error Resume Next existingNums.Add randomNum, CStr(randomNum) On Error GoTo 0 Loop Until Err.Number = 0 ' 写入表字段固化存储 rs.Edit rs!LotteryNumber = randomNum rs.Update rs.MoveNext Loop rs.Close Set rs = Nothing Set existingNums = Nothing MsgBox "生成完成,共生成" & maxNum & "个不重复抽奖号码" End Sub
- 运行该代码后,所有抽奖号码会永久存储在表中,不会因为任何界面操作发生变化,且所有号码完全唯一。
临时查询方案(仅适合临时预览,不推荐用于正式抽奖)
如果不需要永久存储随机数,可以用调整后的查询计算字段写法,大幅降低重复概率,但依然无法解决数值变动问题:
- 先给你的表增加一个自动编号主键字段,命名为
ID - 查询计算字段写法:
Random Number: Int(Rnd(-Timer()*[ID])*DCount("*","你的表名"))+1
抽奖抽取操作参考
号码生成完成后,可使用以下SQL抽取指定数量的中奖者,结果固定不会漂移:
-- 此处TOP 10代表抽取10名中奖者,可根据需求调整数量 SELECT TOP 10 * FROM 你的表名 ORDER BY Rnd(-LotteryNumber)
内容的提问来源于stack exchange,提问作者JAtlasNewGuy
相关产品推荐
相关产品推荐

