使用VBA重复生成随机数

使用VBA重复生成随机数

我知道在 Excel 中可以使用rand()函数生成随机数,并且每次按下F9,该表上的所有rand()结果都会刷新。

但是,现在我需要使用 VBA 重复生成随机数,并控制它,以便随机数不会刷新,除非代码命令如此。

例如我有

  • 范围 A1~A100,我想要生成随机数;
  • B列是计算的地方,Excel“规划求解”函数的一些计算通过VBA执行;
  • 我希望在 C 列记录 1,000 次计算,每次都从 B 列开始;
  • 最终结果是C列的平均值。

现在我的问题是

  1. 我不知道如何使用 VBA 刷新 A 列中的单元格,我该怎么做?
  2. 我注意到,在 VBA 解算器函数期间,随着 B 列中的单元格更新,每次更新时,A 列的随机数都会刷新 - 我该如何抑制这种情况?

答案1

下面的 VBA 将在活动工作表的 1 到 100 单元格中粘贴一个随机数。每次运行宏时,单元格都会更新

 Sub GenerateRandom()
     Dim i As Long
     For i = 1 To 100
         Range("A" & i) = rnd()
     Next i 
End Sub

ALT+F8View Macros

注意:您可以运行其他计算(包括公式),A 列中的数字不会改变。您必须手动更改它们或重新运行上述宏。希望这能有所帮助

答案2

我在工作表上插入了一个“按钮”表单控件(必须选中选项->自定义功能区->主选项卡下的复选框以启用开发人员选项卡),并且在每次单击时运行此宏:

Public Sub ran()
Dim a As Range
    For i = 1 To 100
        Dim r As Integer
        r = Int(Timer * Rnd())   'truncate the random number to an integer
        Cells(i, 1).Value = r    'set the value in the cell to this random number
    Next i
End Sub

Rnd() 会生成一个范围在 [0, 1) 内的数字,因此我只需将其乘以系统计时器(使用百分之一秒)并使用 Int() 将其四舍五入为整数即可。如果您想要小数,则可以省略 Int(),并可以选择设置最小-最大范围,您可以执行以下操作

r = (max - min) * r + min

...你得到了计时器种子。

答案3

  1. 我认为 Excel 默认在某些单元格发生变化时自动更新所有单元格。您可以在设置中取消此设置
  2. 首先,您应该知道,在 Excel 中反复生成随机数会导致非常短的循环,之后数字会重复出现。在 Excel 的更高版本中,这种情况可能已经发生了变化(但我对此表示怀疑),但在 Excel 97 中,我看到了一个长度为 4 的循环!即,在四次生成 100 个随机数之后,它生成的是完全相同的 100 个随机数。您必须巧妙地设置种子。其次,您可以通过录制宏来生成所需的 VBA 代码,在宏中使用数据分析工具库 (VBA) 插件随机数生成来生成随机数:它用数字填充单元格,而不是 rand() 函数。要在 XL2007-VBA 中添加工具库:

AddIns("Analysis ToolPak - VBA").Installed = True

在单元格 A1:A100 中获取 100 个随机数:

Application.Run "ATPVBAEN.XLAM!Random", ActiveSheet.Range("$A$1"), 1, 100 _ , 1, , 0, 1

答案4

按 F9 不会从 VBA 函数中生成新的随机值,但按Ctrl+Alt+F9(Excel 的“全局重新计算”组合键)将会。

相关内容