为什么这只会产生一对解决方案

时间:2018-01-16 09:04:49

标签: excel vba random

这是一个稍微有点问题。

我有一个长1500行代码,里面有多个子代码,背后的想法是平滑100,000个数据点。

我在代码中有一个随机数生成器,在下面找到但是每当我运行主代码时,我的两个限制总是ListBox.ClearSelected()UpperAngleLimit= 79但是每当我只运行这个sub时我发现我得到了像计划的总随机数。

以下是Random Limits生成的代码。

LowerAngleLimit = 6

我还提到Sub Random_Limits() UpperAngleLimit = Int((90 - 1 + 1) * Rnd + 1) LowerAngleLimit = Int((90 - 1 + 1) * Rnd + 1) If UpperAngleLimit = LastUpperLimit Then Call Random_Limits Else If LowerAngleLimit = LastLowerLimit Then Call Random_Limits Else If UpperAngleLimit > LowerAngleLimit Then If UpperAngleLimit > 60 Then If LowerAngleLimit < 45 Then LastLowerLimit = LowerAngleLimit LastUpperLimit = UpperAngleLimit Call Calculate_Angle Else Call Random_Limits End If Else Call Random_Limits End If Else Call Random_Limits End If End If End If End Sub &amp;的所有其他提及。 UpperAngleLimit也是如此。

LowerAngleLimit

^^变量定义

Global UpperAngleLimit As Double
Global LowerAngleLimit As Double

^^如果用户不想随机生成限制,则使用

RandomLimits = MsgBox("Would you like to have random limits generated?", vbYesNo)

If RandomLimits = vbYes Then

    Call Random_Limits

End If

UpperAngleLimit = InputBox("What Upper Angle Limit would you like to spline the curve from?")
LowerAngleLimit = InputBox("What Lower Angle Limit would you like to spline the curve from?")

Call Limit_Def

^^用于识别个体细胞

If Cells(j, 3) < UpperAngleLimit And Cells(j, 3) > LowerAngleLimit Then

^^用于命名数据​​组

这些都是Cells(1, 4) = "Curve Data produced for limits at " & UpperAngleLimit & " and " & LowerAngleLimit & " @ " & Limit UpperAngleLimit

的提及

我觉得我可能很难得到与我一样的问题,因为我总是79岁和以上。 6但你可能会看到一个我忽略的误报。

一些额外的细节,

代码将在第3个循环中始终生成79和6,并且预先生成相同的数字。

第1次运行 - LowerAngleLimit UpperAngleLimit = 64 第2次运行 - LowerAngleLimit = 49 UpperAngleLimit = 74 第3次运行 - LowerAngleLimit = 64 UpperAngleLimit = 78 运行4 - lowerAngleLimit = 72 UpperAngleLimit = 79

这是通过5次试运行确认的

我没有附加调用Random_Limits的sub来提供更详细的信息

LowerAngleLimit = 6

根据要求,Sub Data_SetUp() Application.ScreenUpdating = False Sheets("Sheet1").Columns(2).Copy Destination:=Sheets("Sheet2").Columns(1) Sheets("Sheet1").Columns(5).Copy Destination:=Sheets("Sheet2").Columns(2) Worksheets("Sheet2").Activate Rows(4).EntireRow.Delete Cells(3, 1) = "Time" Cells(3, 2) = "Throttle" Cells(3, 3) = "Angle" Cells(2, 1).Select Selection.ClearContents StartTimer = Timer Iterations = InputBox("How many iteration would you like to run?") IterationNumber = 1 RandomLimits = MsgBox("Would you like to have random limits generated?", vbYesNo) If RandomLimits = vbYes Then Call Random_Limits End If UpperAngleLimit = InputBox("What Upper Angle Limit would you like to spline the curve from?") LowerAngleLimit = InputBox("What Lower Angle Limit would you like to spline the curve from?") Call Limit_Def End Sub

Limit_Def

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:2)

根据this answer:如果您遇到Rnd问题,请事先使用Randomize重新播种随机数生成器。

  

<强>语法

     

随机化 [数字]

     

可选的数字参数是Variant或任何有效的数字   表达。

     

<强>说明
  随机化使用数字初始化Rnd   函数的随机数生成器,给它一个新的种子值。如果你   省略 number ,系统计时器返回的值用作新的   种子价值。如果未使用 Randomize ,则使用Rnd函数(没有   arguments)在第一次调用时使用与种子相同的数字,   然后使用最后生成的数字作为种子值。

为什么Rnd在某些情况下单独使用并且在其他情况下单独工作有点超出我的范围,但我冒昧地猜测它与主要子有关控制堆栈或运行时作用域,防止Rnd自行随机化(按照预期) - 基本上创建上述引用末尾描述的情况。也许