如果我正在迭代k = 1到100,如果没有满足条件,我有时需要重新开始迭代。在这种情况下,我创建一个介于1和100之间的随机数,但如果该数字低于51,我希望迭代重新开始。
现在代码返回的是可变数量的值。有时1,有时90.
任何想法为什么?
Public k as long
Sub Example()
For k = 1 To 100
Call ExampleExtended
Next k
End Sub
Sub ExampleExtended()
Dim Val As Integer
Val = Int((100 - 1 + 1) * Rnd)
If Val < 51 Then
k = k - 1
Exit Sub
End If
Debug.Print Val
End Sub
答案 0 :(得分:4)
k被视为两个潜艇的局部变量,因此您不会像您认为的那样更新k。要么增加k的范围(我不推荐),要么使ExampelExtended()成为一个函数,返回你可以在调用子中使用的东西。
这是一种方法。显然这个函数有点矫枉过正,但试图展示如何使用函数将值返回给调用子函数:
Sub Example()
Dim counter As Integer, _
randNumber As Integer
For counter = 1 To 100
randNumber = RandomBetween(50, 100)
Debug.Print randNumber
Next counter
End Sub
Function RandomBetween(lowerBound As Integer, upperBound As Integer) As Integer
RandomBetween = Application.WorksheetFunction.RandBetween(lowerBound, upperBound)
End Function
这更接近吗?
Option Explicit
Sub Example()
Dim counter As Integer, _
randNumber As Integer
For counter = 1 To 100
randNumber = RandomBetween(1, 100)
If randNumber < 50 Then
counter = counter - 1
Else ' this is here just as a check...should only print 100 numbers
Debug.Print randNumber
End If
Next counter
End Sub
答案 1 :(得分:2)
使用Do While循环看起来更适合这种情况。 Do While循环不确定直到满足条件 - 在这种情况下,直到随机数为&gt; 51.像这样:
val = 1
Do While val < 51
Val = Int((100 - 1 + 1) * Rnd)
Loop
虽然在你的情况下,可以通过强制随机数在51和15之间来进一步简化。 100,像这样[取自这里:http://www.cpearson.com/excel/randomNumbers.aspx:
Dim Low As Double
Dim High As Double
Low = 51 '<<< CHANGE AS DESIRED
High = 100 '<<< CHANGE AS DESIRED
val = Int((High - Low + 1) * Rnd() + Low)
答案 2 :(得分:1)
你的循环至少有100次迭代,平均150次迭代!
但是,Debug.Print Val
平均被称为50次。
因此,您几乎总是在控制台窗口中看到少于100个值。
(2^(-100)
有机会在控制台窗口中看到100行
如果您将代码更改为:
Public k as long
Sub Example()
For k = 1 To 100
Call ExampleExtended
Next k
End Sub
Sub ExampleExtended()
Dim Val As Integer
Val = Int((100 - 1 + 1) * Rnd)
Debug.Print Val
If Val < 51 Then
k = k - 1
Exit Sub
End If
End Sub
循环执行的时间与控制台中的行数相同
答案 3 :(得分:0)
您可以使用转到:
Sub Example()
For k = 1 To 100
Call ExampleExtended
Next k
End Sub
Sub ExampleExtended()
Dim Val As Integer
start:
Val = Int((100 - 1 + 1) * Rnd)
If Val < 51 Then
goto start
k = k - 1
Exit Sub
End If
Debug.Print Val
End Sub
看看它是否有效