【问题标题】:How do I create an array with random numbers?如何创建带有随机数的数组?
【发布时间】:2015-11-04 23:47:38
【问题描述】:

我是新手。我想创建一个包含 16 个元素的数组。假设我的数组是 ReDim arr(15) as Integer 并且在该数组中我想将数字从 1 放入 16 但加扰,例如 arr(0) = 3、arr(5) = 8 等等。

【问题讨论】:

  • arr(15) 只给你 15 个元素。
  • 那么...你有没有尝试过
  • arr(15)(又名arr(0 to 15))给出16个元素。
  • 我认为这个数字给了你元素的数量,所以 arr(15) 会是 0-14?但吉普永远是对的^_^;编辑:啊,数字是上限而不是元素。但是,如果您的选项基数为 1,那么它的元素 =P Edit2: 所以我一直都做错了 XD
  • 是的,如果括号中只有一个值,则将其视为上限,将0视为下限。

标签: arrays vba excel random


【解决方案1】:

试试这个:

Sub MAIN()
   Dim ary(1 To 16) As Variant
   Dim i As Long, msg As String

   For i = 1 To 16
      ary(i) = i
   Next i

   Call Shuffle(ary)

   msg = ""
   For i = 1 To 16
      msg = msg & vbCrLf & ary(i)
   Next i
   MsgBox msg
End Sub

Sub Shuffle(InOut() As Variant)
    Dim HowMany As Long, i As Long, J As Long
    Dim tempF As Double, temp As Variant

    Hi = UBound(InOut)
    Low = LBound(InOut)
    ReDim Helper(Low To Hi) As Double
    Randomize

    For i = Low To Hi
        Helper(i) = Rnd
    Next i


    J = (Hi - Low + 1) \ 2
    Do While J > 0
        For i = Low To Hi - J
          If Helper(i) > Helper(i + J) Then
            tempF = Helper(i)
            Helper(i) = Helper(i + J)
            Helper(i + J) = tempF
            temp = InOut(i)
            InOut(i) = InOut(i + J)
            InOut(i + J) = temp
          End If
        Next i
        For i = Hi - J To Low Step -1
          If Helper(i) > Helper(i + J) Then
            tempF = Helper(i)
            Helper(i) = Helper(i + J)
            Helper(i + J) = tempF
            temp = InOut(i)
            InOut(i) = InOut(i + J)
            InOut(i + J) = temp
          End If
        Next i
        J = J \ 2
    Loop
End Sub

【讨论】:

    【解决方案2】:

    这是一些非常懒惰的代码:

    Dim arr(15) As Integer
    Dim i As Integer, j As Integer
    i = 1
    Do
        j = Int(16 * Rnd)
        If arr(j) = 0 Then
            arr(j) = i
            i = i + 1
        End If
    Loop Until i = 17
    

    Rnd 生成一个从 0 到 1 的 single,将其乘以 16 并用 Int 去除小数部分,它会给你一个从 0 到 15 的随机数。

    效率不高,我不会在生产中使用它,但它会完成工作。

    希望这会有所帮助!

    【讨论】:

    • 不,它不会,我在这段代码中想到了这一点。如果 rnd 函数返回一个已经被使用过的值,它只会重新开始循环。
    • 你是对的,我很抱歉,并将删除我的评论。我错过了 if 语句。这对于请求的小子集非常有用。我有兴趣知道平均循环数以使它们全部填充。如果子集变大,很有可能会出现无限循环。这不是所要求的,而且这一小部分不会冒这种风险。
    • 是的,正如我所说,这不是很好的代码,但它会在这里完成工作,你只会将它用于小型集合。我运行了 500 次,平均需要 35 次循环才能完成,但所有 500 次循环不到一秒,所以我不太担心。如果这是认真制作的代码,我会正确编写。
    猜你喜欢
    • 2018-08-22
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多