51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1784|回复: 7
打印 上一主题 下一主题

[原创] 用vbs写了一段代码,请高手指教

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2010-6-29 14:44:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这段代码是为了产生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

这里面还有其他的错误请帮忙指出来,谢谢!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2010-6-29 17:33: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
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2010-6-30 14:58:08 | 只看该作者
谢谢楼上的回复,不过我发现你的代码还是有可能出现重复数字的,你的做法是新产生的随机数跟之前的重复的时候再随机产生一个数字,但这个新产生的随机数没有跟之前产生的随机数进行比较,还是有可能重复的,所以我想用递归的方法,使得每次有重复随机数后,再产生的随机数也要进行比较
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2010-6-30 15:33:31 | 只看该作者
不用递归

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
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2010-6-30 16:55:24 | 只看该作者

回复 3# 的帖子

不会重复的
n=0 是关键

[ 本帖最后由 skyzhu 于 2010-6-30 17:00 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2010-7-1 10:00:48 | 只看该作者
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
复制代码
回复 支持 反对

使用道具 举报

该用户从未签到

7#
 楼主| 发表于 2010-7-1 16:28:06 | 只看该作者

回复 5# 的帖子

谢谢,后来我也想到了这种方法,把置零
回复 支持 反对

使用道具 举报

该用户从未签到

8#
 楼主| 发表于 2010-7-1 16:30:25 | 只看该作者

回复 6# 的帖子

初学,谢谢指点
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-9-20 16:30 , Processed in 0.066444 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表