微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ms Access中的rnd函数返回相同的值

如何解决ms Access中的rnd函数返回相同的值

我有以下ms访问查询

SELECT * from mytable WHERE chaptId IN (SELECT Top 1 chaptId FROM (SELECT chaptId,Rnd(RowID) AS RandomValue FROM mytable) ORDER BY RandomValue)

基本上,它从表中获取一个随机的唯一chaptID值,并为此值提取具有该chaptID值的所有行。

它通过ms访问完美运行。当我尝试从VB6(ADO DB)中运行它时,它总是返回相同的chaptID,从而返回相同的章节。搜索后,我发现必须使用Randomize函数。我不知道如何在查询包括它。因此,我尝试将其包装为:Rnd(Randomize(RowID))。我不知道该怎么用。

我收到的消息是Undefined function Randomize in epxression

我该如何解决这个问题?

谢谢。

解决方法

如发现的那样,在通过ODBC / ADO使用Rnd时不可能随机化。

这意味着我们必须以某种方式引入随机性。

一个明显的选择是使用系统计时器:

SELECT * from mytable WHERE chaptId IN (SELECT Top 1 chaptId  FROM  (SELECT chaptId,Rnd(-1 * (RowID + Timer() * 100)) AS RandomValue FROM mytable) ORDER  BY RandomValue)
,

您可以在 rownumbers VBA.RowNumbers上研究我的项目,该项目还处理伪随机排序-请参见第4段,格式为“ Form_RandomProducts.cls”。

有关真正的随机数,请参见我的项目VBA.Random。更多代码,但易于实现。

如果您只能运行本机Access SQL,则此基本查询应该可以执行(作为您的子查询):

SELECT
    *,Rnd(-Timer()*[RowID]) AS [Rnd Generator]
FROM
    mytable
ORDER BY
    Rnd(-Timer()*[RowID]);
,

由于您的目标是每次获得一个随机的章节,所以为什么不运行查询之前先获得一个随机的章节:

Dim FirstChapter as Integer
Dim LastChapter as Integer
Dim RandomChapter as Integer

FirstChapter = DMin("ChaptId","mytable")
LastChapter = DMax("ChaptId","mytable")

Randomize 
 
RandomChapter = Int((LastChapter - FirstChapter + 1) * Rnd + FirstChapter)

'run vba ADO code for the following SQL
"SELECT * from mytable WHERE chaptId IN (" & RandomChapter & ")"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。