【问题标题】:unique random number generation in AccessAccess 中的唯一随机数生成
【发布时间】:2021-07-07 22:36:40
【问题描述】:

我正在尝试在我的查询中添加一个从 0 开始的唯一随机数 - 列表长度,它用于随机数与中奖号码相关联的彩票。

我拥有的字段是玩家姓名(可以重复,因为他们可以购买多张门票)员工 ID(再次重复)和支付金额。

我试过RND功能:Random Number: Int(Rnd([Employee ID])*20288)+1

但是我得到了重复的数字,当我尝试在数据表中排序时,随机数会自行更新,即使我只是点击记录,它也会发生变化。

玩家姓名 员工ID 支付金额 随机数 比尔比尔 000012 15.00 14756 姓名2 000452 20.00 13916 姓名2 000452 20.00 9512

有什么想法吗?

【问题讨论】:

  • 您必须在生成数字时存储它们,然后通过将每个新生成的数字与存储的数字进行比较来检查是否重复。

标签: ms-access ms-access-2016


【解决方案1】:

您可以使用此处的函数RandomRowNumberVBA.RowNumbers 对数字进行排序。

另一种极其简单的方法是将彩票号码写入具有 GUID随机自动编号 的(临时)表(在表设计器中,Access 将其称为复制 ID)作为主键。然后对其进行排序,并在查询中选择Top N 记录以获取中奖号码。

【讨论】:

  • GUID + Top N 方法很酷! :)
【解决方案2】:

试试这个功能:

Public Function GetRandomDouble(Optional ByVal iLength As Integer = 3) As Double
    Dim s As String: s = String(iLength, " ")     'fixed length string with 8 characters
    Dim n As Integer
    Dim ch As Integer 'the character
      Randomize
    For n = 1 To Len(s) 'don't hardcode the length twice
        Do
            ch = Rnd() * 127 'This could be more efficient.
            '48 is '0', 57 is '9', 65 is 'A', 90 is 'Z', 97 is 'a', 122 is 'z'.
        Loop While ch < 48 Or ch > 57 'And ch < 65 Or ch > 90 And ch < 97 Or ch > 122
        Mid(s, n, 1) = Chr(ch) 'bit more efficient than concatenation
    Next
  
GetRandomDouble = CDbl(s)
End Function

并像这样在您的查询中使用它

Random Number: GetRandomDouble(5)

【讨论】:

    猜你喜欢
    • 2020-12-04
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2011-12-28
    相关资源
    最近更新 更多