MS Access中的静态随机数

问题描述 投票:2回答:2

我正在尝试使用以下公式来创建静态随机数。

Random Number: Format(Int((99999999-11111111+1)*Rnd([Numbers]+11111111)))

然而,它返回一个不同的非静态随机数。

有什么建议?

ms-access access-vba
2个回答
1
投票

你可以否定提供给Rnd函数的数值参数,使Rnd函数返回给定种子值的相同随机数(也就是说,随机数和种子值之间会有一对一的映射) :

句法

Rnd[(number)]

返回值

如果数字是

  • 小于零:每次使用相同的数字,使用数字作为种子。
  • 大于零:序列中的下一个随机数。
  • 等于零:最近生成的数字。
  • 未提供:序列中的下一个随机数。
?rnd(-2)
 0.7133257 
?rnd(-2)
 0.7133257 
?rnd(-3)
 0.9633257 
?rnd(-3)
 0.9633257 

但是,更好的方法可能是使用静态随机数填充源表中的其他字段,或者构造包含名称和随机数之间映射的单独表。

对于您的特定情况,由于您要生成8位数的随机数,您将使用:

10000000 + Int(90000000 * Rnd(-[Names]))

这将产生1000000099999999范围内的随机数。


0
投票

您可以使用我文章中的RandomRowNumber函数:

Random Rows in Microsoft Access

' 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

包含一个演示供下载。

代码也可以在GitHub上找到:VBA.RowNumbers

© www.soinside.com 2019 - 2024. All rights reserved.