【问题标题】:Multiple unique random number generation ms-access多个唯一随机数生成 ms-access
【发布时间】:2020-12-04 03:38:53
【问题描述】:

我想在一个范围内生成 X 个唯一随机数并将这些数字插入到新表中 样本数“X”将在输入表格字段时定义。

现在有

SELECT Int((End_Sample_No-Start_Sample_No)*Rnd()+Start_Sample_No) AS RandNum

我一直在研究如何制作超过 1 个随机数,并确保如果我制作了多个随机数,它还没有被使用。

感谢任何建议或指导。

【问题讨论】:

    标签: sql ms-access random unique


    【解决方案1】:

    首先,无代码解决方案将字段设置为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

    【讨论】:

      【解决方案2】:

      问题在于 Access 会缓存函数调用的结果以提高效率。由于Rnd 是用相同的参数调用的,所以它只会被调用一次,并且一直返回相同的结果。

      为避免这种情况,请传递一个参数。 Rnd 将采用正整数,这不会影响返回的内容。

      SELECT Int((End_Sample_No-Start_Sample_No)*Rnd(ID)+Start_Sample_No) AS RandNum
      

      ID 是您的自动编号列或其他对每条记录唯一的数字列。

      【讨论】:

      • 谢谢,我需要进一步澄清。我想要指定范围内的 X 个随机数。 (上限-下限)
      • 如果我用“10”值代替 ID,你是说我应该得到 10 个随机数吗?因为我仍然只得到 1 个结果。
      • 不,。您需要有一个包含 10 个不同 ID 的表。如果你想在没有表的情况下运行这个,可以使用内置的MSysObjects作为表,并通过指定TOP 10来限制结果数量
      【解决方案3】:

      可能有更好的方法,但这可行。

      1. 使用要为其分配随机数的记录创建一个临时表。 查询将因情况而异。如果我理解正确,您只需要正确数量的记录,并且可以选择任意字段。在我的示例中,我需要首先使用查询 random1 对记录进行分组,因为我正在对一个田地中的植物品种进行随机分布,但希望将具有相同品种的地块放在一起。 ORDER BY 不是必需的,但它可以让您更轻松地看到订单在后续步骤中按照您想要的方式更改。
      SELECT random1.Ans INTO Tmp_Randomisering
      FROM random1
      ORDER BY random1.Ans;
      
      1. 为表分配一个 ID 字段
      ALTER TABLE  [Tmp_Randomisering] ADD COLUMN ID COUNTER;
      
      1. 通过从第一个临时表中选择所有记录并根据它们的 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;
      

      宏将很快执行所有步骤。 如果您有很多记录,和/或经常运行查询,重复添加和删除记录可能会导致数据库文件膨胀。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 2020-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多