如何解决多个唯一的随机数生成ms-access
我想在一个范围内生成X个唯一的随机数,并将这些数字插入到新表中 输入表的字段时,将定义样本“ X”的数量。
此刻我有
SELECT Int((End_Sample_No-Start_Sample_No)*Rnd()+Start_Sample_No) AS RandNum
我一直在研究如何制作多个随机数,并确保如果我制作了多个随机数,那么该数字将不会被使用。
任何建议或指导都会受到赞赏。
解决方法
问题在于Access会缓存函数调用的结果以提高效率。由于Rnd
是用相同的参数调用的,因此它只会被调用一次,并始终返回相同的结果。
为避免这种情况,请传递参数。 Rnd
将采用正整数,这不会影响返回的内容。
SELECT Int((End_Sample_No-Start_Sample_No)*Rnd(ID)+Start_Sample_No) AS RandNum
ID
是您的自动编号列或每个记录唯一的另一个数字列。
首先,无代码解决方案将字段设置为 AutoNumber ,并将其属性设置为 Random 。
然后,每当添加记录时,都会插入一个(伪)随机数,而您不必提前创建记录。
如果这不符合您的目的,则在插入数据后 应用随机数可能会更容易。然后,您可以使用我的功能:
' Builds random row numbers in a select,append,or create query
' with the option of a initial automatic reset.
'
' 2018-09-11. Gustav Brock,Cactus Data ApS,CPH.
'
Public Function RandomRowNumber( _
ByVal Key As String,_
Optional Reset As Boolean) _
As Single
' Error codes.
' This key is already associated with an element of this collection.
Const KeyIsInUse As Long = 457
Static Keys As New Collection
On Error GoTo Err_RandomRowNumber
If Reset = True Then
Set Keys = Nothing
Else
Keys.Add Rnd(-Timer * Keys.Count),Key
End If
RandomRowNumber = Keys(Key)
Exit_RandomRowNumber:
Exit Function
Err_RandomRowNumber:
Select Case Err
Case KeyIsInUse
' Key is present.
Resume Next
Case Else
' Some other error.
Resume Exit_RandomRowNumber
End Select
End Function
和示例查询(使用 Northwind 示例数据库中的表):
SELECT
ID,[Order ID],[Unit Price],RandomRowNumber(CStr([ID])) AS RandowRow
FROM
[Order Details]
ORDER BY
RandomRowNumber(CStr([ID]));
它取自我的项目VBA.RowNumbers。
如果您不想使用伪随机数,而是真正的随机数,请研究我的项目VBA.Random。
,可能有更好的方法,但这是有效的。
- 用您要为其分配随机数的记录创建一个临时表。 查询将因情况而异。如果我理解正确,您只需要正确数量的记录,并且可以选择任意字段。在我的示例中,我需要首先使用查询 random1 对记录进行分组,因为我要在田间随机分布植物品种,但希望将具有相同品种的地块放在一起。 ORDER BY 不是必需的,但它可以更容易地看到订单在后续步骤中更改为您想要的方式。
SELECT random1.Ans INTO Tmp_Randomisering
FROM random1
ORDER BY random1.Ans;
- 为表格分配一个 ID 字段
ALTER TABLE [Tmp_Randomisering] ADD COLUMN ID COUNTER;
- 通过从第一个临时表中选择所有记录并根据其 ID 以随机顺序对它们进行排序来创建第二个临时表。可以包含旧 ID 字段以检查流程是否按预期方式工作。
SELECT Tmp_Randomisering.Ans,CLng([tmp_randomisering].[ID]) AS old_ID INTO tmp_randomisering2
FROM Tmp_Randomisering
ORDER BY Rnd([tmp_randomisering].[ID]);
4.添加一个 ID 列,以随机顺序获取 1 和记录数之间的整数。
ALTER TABLE [Tmp_Randomisering2] ADD COLUMN ID COUNTER;
宏将很快执行所有步骤。 如果您的记录非常多,和/或经常运行查询,则重复添加和删除记录可能会导致数据库文件膨胀。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。