返回相同系列的随机值

时间:2014-05-03 03:31:51

标签: vba ms-access random access-vba ms-access-2010

我在拆分表单上有一个按钮,用于打开更新查询,更新我名为Items的表的随机ID字段,然后按随机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 Button嵌入式宏看起来像

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

1 个答案:

答案 0 :(得分:0)

我这里没有真正的解决方案,但我确实有一些指示。当使用否定参数调用时,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(两者都没有参数)应该给你随机数。