【发布时间】:2012-06-21 16:13:54
【问题描述】:
我正在尝试为其创建一个采样工具
我需要在 0 到 3000 之间以 500 的倍数随机生成数字,这样它们的总和就是一个固定数字,比如 12 个插槽中的 10000
除此之外,我需要运行大约 100000 到 1000000 的多次迭代(尚未决定。
我的方法是创建一个二维数组,设置一个约束来验证一次迭代的总和,并且只有当条件为真时才将其输入到最终的数据样本中。
我在以下代码中犯了一些非常可怕的错误,无法弄清楚在哪里......感谢帮助
Public Sub Generatenums()
Dim GRP() As Long, Random() As Long
Dim RandomTotal As Long, t As Long, w As Long, i As Long, j As Long
ReDim GRP(1 To 100, 1 To 12)
ReDim Random(1 To 12)
For i = 1 To 100
For j = 1 To 12
Random(j) = Int(Rnd() * 7) * 500
RandomTotal = RandomTotal + Random(j)
Next j
If RandomTotal = 10000 Then
For k = 1 To 12
GRP(i, k) = Random(k)
Next k
End If
Next i
Range("A1").Select
For t = 1 To 100
For w = 1 To 12
Cells(t, w).Value = GRP(t, w)
Next w
Next t
End Sub
【问题讨论】:
-
首先,你应该用嵌套的 for 循环重写它,而不是硬编码 1、2、3... 12。
-
我可以尝试将变量 j 从 1 变为 12。我同意它使程序不那么笨重
-
总体上它还使其更具可读性,这可能有助于您(或其他人)更轻松地诊断问题。另外,RandomTotal 目前的用途是什么?
-
好吧,这样更好。但是,目前,如果您的总和不正确,您只需转到 i 的下一个值,而无需向该 GRP 行填充值。你有几个选择。您可以在第一个循环中循环以继续生成数字,直到总和为 10000。或者您可以尝试提出一种算法来保证您的数字之和为 10000。(我必须警告您,12 个数字总和为 10000给每个数字的平均值约为 833,但随机生成 0 到 3000 之间的数字会给你平均每个 1500 的数字,几乎是你想要的两倍!)
-
随机化 11 个值,然后从 10,000 中减去它们的总数,得到第 12 个。如果最后一个不在您的范围内,您将不得不重新开始,但它会比生成所有 12 个更快地产生结果。
标签: arrays excel vba random sampling