首页 > 解决方案 > 从一维数组中选择随机项目不重复

问题描述

我正在尝试使用此代码从一维数组中选择随机项

Sub Select_Random_Item_From_1D_Array()
    Dim arr(), x As Long
    arr = Array("Good", "Very Good", "Excellent")
    Randomize
    x = Int((UBound(arr) + 1) * Rnd + 1)
    Debug.Print arr(x - 1)
End Sub

我怎样才能防止重复?我的意思是我需要随机选择所有项目,不要重复。如果选择了所有项目,则重置该过程。只是我需要随机选择所有项目

标签: excelvba

解决方案


您可以创建第二个Booleans具有相同长度的数组。该数组仅用 初始化False。如果 rand 选择了数组中的值,则将布尔数组匹配值设置为True. 如果下一次的 rand 值是一个已经被选择的值(True在布尔数组中带有 a ),请再次执行 rand

一步一步尝试这个小例子,你会看到逻辑:

Sub Select_Random_Item_From_1D_Array()
    Dim arr(), x As Long, cpt As Long
    Dim mBool(2) As Boolean
    cpt = 0
    arr = Array("Good", "Very Good", "Excellent")
    Do While cpt < 3 '3 being the number of items in your array + 1 (from 0 to 2)
        Randomize
        x = Int((UBound(arr) + 1) * Rnd + 1)
        If mBool(x - 1) = False Then
            mBool(x - 1) = True
            Debug.Print arr(x - 1)
            cpt = cpt + 1
        End If
    Loop
End Sub

它将从您的数组中打印一个随机项目,并且每次这样做都会将第二个数组的匹配值从 更改FalseTrue。然后它再次执行它,如果它已经被打印(如果布尔数组上的匹配值为True),它会再次尝试。

我添加了一个名为 的变量cpt,它从 0 到数组中的项目数,它使算法在一次打印所有项目时停止。

这可能不是他做你想做的最好的方式,但它很有效,而且并不复杂


推荐阅读