51Testing软件测试论坛

标题: 用vbs写了一段代码,请高手指教 [打印本页]

作者: gdutlzl    时间: 2010-6-29 14:44
标题: 用vbs写了一段代码,请高手指教
这段代码是为了产生6个不重复的随机数:
Dim i,m,A(6)
Randomize
Do until Response=vbNo
  For i=1 to 6

    Redvalue=(int(Rnd*20)+1)
     
    Call Redvalue =Unduplicated(Redvalue,i)  ‘调用Unduplicated(Myvalue,m)
        (将Function的返回值赋值给Redvalue,这样写对吗?)
    A(i-1)=Redvalue
  Next
  Msgbox(&A(0)&","&A(1)&","&A(2)&","&A(3)&","&A(4)&","&A(5))   ‘打印出产生的6个随机数
  Response=Msgbox("继续?",vbyesno)
Loop

Function Unduplicated(Myvalue,m)
Dim j
For j= 0 to m
  if Myvalue=A(j) then
    (我想将主函数中的字符数组A在这里用一下,感觉肯定用错了,但不知道正确的应该数怎么样的)
     Do until Myvalue<>A(j)
        Myvalue=(int(Rnd*20)+1)  ‘重复的再重新产生随机数
        Call Unduplicated(Myvalue,m) ‘递归检测前面已经产生的随机数是否和新产生的随机数重复
     Loop
  End if
Next

End Function

这里面还有其他的错误请帮忙指出来,谢谢!
作者: skyzhu    时间: 2010-6-29 17:33
'递归最好是少用,给个参考的
'随机数函数(最大随机整数范围,总个数)
Function CreateRandomNum(MaxNumarea,Count)
    Dim Num(999)
    Dim i,j,n,tmp
    Randomize
    For i = 1 To Count
        Num(i) = Int((MaxNumarea)*Rnd + 1)  
        If i > 1 Then
            For n = 1 To i-1   
                If Num(i) = Num(n) Then
                    Num(i) = Int((MaxNumarea)*Rnd + 1)
                    n = 0
                End If
            Next
        End If
    Next
    CreateRandomNum = Num   '返回数组
End Function
作者: gdutlzl    时间: 2010-6-30 14:58
谢谢楼上的回复,不过我发现你的代码还是有可能出现重复数字的,你的做法是新产生的随机数跟之前的重复的时候再随机产生一个数字,但这个新产生的随机数没有跟之前产生的随机数进行比较,还是有可能重复的,所以我想用递归的方法,使得每次有重复随机数后,再产生的随机数也要进行比较
作者: TIB    时间: 2010-6-30 15:33
不用递归

Dim num,A(6),Redvalue
Randomize
num = 0
Redvalue = 0
While num<6
    newnum = Int(20 * Rnd + 1)
    iR = False
    For I = 0 To num
        IF A(I) = newnum Then
            iR = True
        End IF
    Next
    If iR = False Then
        A(num) = newnum
        num = num + 1
    End If   
Wend
作者: skyzhu    时间: 2010-6-30 16:55
标题: 回复 3# 的帖子
不会重复的
n=0 是关键

[ 本帖最后由 skyzhu 于 2010-6-30 17:00 编辑 ]
作者: hsjzfling    时间: 2010-7-1 10:00
LZ代码中小错误不少,全都改掉了,然后将判断是否重复的代码改为用字典对象来实现
  1. Dim i,m,s,oDict
  2. Set oDict = CreateObject("Scripting.Dictionary")
  3. Randomize
  4. Do Until Response=vbNo
  5.         s = ""
  6.          For i=1 To 6
  7.                  Do
  8.                    Redvalue=(int(Rnd*20)+1)
  9.         Loop While oDict.Exists(Redvalue)
  10.         oDict.Add Redvalue,Redvalue
  11.         Next
  12.         For Each item In oDict.Items
  13.                 s = s & item & vbNewLine
  14.         Next
  15.         MsgBox s
  16.         Response=Msgbox("Continue?",vbyesno)
  17.         oDict.RemoveAll
  18. Loop
复制代码

作者: gdutlzl    时间: 2010-7-1 16:28
标题: 回复 5# 的帖子
谢谢,后来我也想到了这种方法,把置零
作者: gdutlzl    时间: 2010-7-1 16:30
标题: 回复 6# 的帖子
初学,谢谢指点




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2