【问题标题】:Returning same series of random values返回同一系列的随机值
【发布时间】:2023-04-08 16:09:01
【问题描述】:

我在拆分表单上有一个按钮,该按钮打开一个更新查询,它更新我的名为 Items 的表的 Random ID 字段,然后按 Random ID 对表进行排序。它使用“Rnd([ID])*Rnd(Now())”更新该字段,使值看起来足够随机。它似乎工作得很好,直到我意识到出了什么问题。

每次打开 Access,加载数据库表单,然后单击按钮,我都会得到相同系列的随机值。例如,第一次单击按钮时,顶部的项目是项目 X,随机 ID 已设置为 1.53779983520508E-05。如果我再次单击它,项目 Y 现在位于顶部,其随机 ID 为 9.06816168821933E-08。第三次,项目 Z 位于顶部,随机 ID 为 1.8881419094896E-08。

我可以整天按住按钮并获得全新的订单和号码,这很适合我。问题是当我必须重新打开数据库时。

无论表格以什么顺序开始,即使我将其完全恢复为使用另一个字段作为排序顺序,当我在打开数据库后第一次单击“随机化”按钮时,项目 X 始终位于顶部,始终带有值 9.06816168821933E-08。在第二次单击时,项目 Y 为 1.53779983520508E-05。第三次单击,项目 Z 为 1.8881419094896E-08。每次连续点击总是返回与我在上一个会话中最后一次到达该点时相同的一组随机 ID 值。

我尝试将 Randomize 按钮添加到 RunCode 并调用 RandomizeFunc(),这是我这样编写的函数:

Option Compare Database
-----
Public Function RandomizeFunc()
Randomize
End Function

我知道调用 Randomize 会重置随机种子。但这没有任何区别。值的顺序始终相同。

谁能告诉我我到底做错了什么?

编辑:

这是分配随机 ID 查询

Assign Random ID
-----
Field:  Random ID
Table:  Items
Update To:  Rnd([ID])*Rnd(Now())*Rnd([ID]*Now())

(我徒劳地添加了一些无关的 Rnd,试图让这些值停止重复......)

这是嵌入的随机按钮宏的样子

Randomize : On Click
-----
RunCode
    Function Name   RandomizeFunc()
OpenQuery
    QueryName   Assign Random ID
    View        Datasheet
    Data Mode   Read Only
SetOrderBy
    OrderBy     [Random ID]
Control Name

【问题讨论】:

  • 代码如何使用Rnd?而且,RandomizeFunc 在哪里/何时被调用?
  • 我添加了来自查询和嵌入宏的代码

标签: vba ms-access random


【解决方案1】:

我在这里没有真正的解决方案,但我确实有一些建议。 Rnd 函数在使用否定参数调用时会重置(关于同一主题的有用帖子here)。当您第一次运行时,您的代码是否可能以否定参数开头?

例子:

Sub jzz()
Dim i As Long

Rnd (-1)

For i = 1 To 10
    Debug.Print Rnd
Next i

End Sub

它会一次又一次地吐出所有相同的数字(相同的 10 序列)。

如果添加randomize,它会生成随机数,但前提是在Rnd (-1) 语句之后调用randomize。如果之前做了,会被Rnd的负值撤消。所以:

Sub jzz()
Dim i As Long

Rnd (-1)
Randomize 'make sure you call it without arguments

For i = 1 To 10
    Debug.Print Rnd
Next i

End Sub

将提供随机数。

所以也许(但我不考虑您的其余代码)您可以尝试从您的 rnd 函数调用中丢弃 [ID] 字段。调用 randomize 然后 rnd (都没有参数)应该给你随机数。

【讨论】:

    猜你喜欢
    • 2021-11-11
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多