For j = 2 To CLng(Sqr(i))
If i Mod j = 0 Then
Flag = True
Exit For
End If
Next
If Flag = False Then
MsgBox i & "不能被任何数整除!", vbInformation + vbOKOnly, "系统提示"
Else
MsgBox i & "能被" & j & "整除!", vbInformation + vbOKOnly, "系统提示"
End If
可以把代码运行一遍, 我觉得结果最有说明力
==========================
虽然都是用第二种方法的思路,但我的步骤与你的有些不同,因为楼主只要求两个随机数,所以temp的值其实并不重要,我的方法是先保证数b的随机性,但如上所说,如果保证了b的随机性,就必然会影响a的随机性,由下面代码的测试结果证明了这一点,a大于50000与a小于50000的比例大概是8:2(我上面的代码里b的取值范围也错了,应该在1~50000之间而不是1~100000之间):
Private Sub Command1_Click()
Randomize
Dim a, b, step As Long
Dim upa, lowa As Long
For i = 1 To 100000
b = Int(50000 * Rnd + 1)
step = Int(100000 / b)
'从2到step取随机数temp
TEMP = Int((step - 1) * Rnd + 2)
a = b * TEMP
'Print Str(a) + "/" + Str(b) + "=" + Str(TEMP)
If a > 50000 Then
upa = upa + 1
Else
lowa = lowa + 1
End If
Next
Print upa, lowa, upb, lowb
End Sub
至于认为方法一不理想,是因为觉得这种方法把有些可能性忽略了,两害相权取其轻。。
要真正的随机,或许真的要回到老路(穷举a/2个数)上????
另;方法一; max(tmp) * max(b) = 10000 * 10000 是10000的10000倍
但任意rnd a * rnd b < 10000的概率却不是成正比关系, 可以用下面代码算出
dim i as long , j as long ,cnt
for i = 1 to 10000
for j = 1 to 10000
if i * j < 10000 then cnt = cnt + 1
next j
next i
debug.print 10000& * 10000 / cnt