Board logo

标题: [问题求助] 为何此VBS生成的随机数中那么多重复的? [打印本页]

作者: lujian2036    时间: 2011-3-25 14:07     标题: 为何此VBS生成的随机数中那么多重复的?

  1. function randomchar(tlen)
  2. dim tmp,i,j
  3. for j=1 to tlen step 1
  4. 'i=randomnumber.value(1,3) 'QTP的用法,不适用于vbs
  5. Randomize
  6. i=int((3*rnd) +1)
  7. '1-大写字母,2-数字,3-小写字母
  8. select case i
  9. Case 1
  10. Randomize
  11. tmp=int(26*rnd)
  12. tmp=tmp+97
  13. case 2
  14. Randomize
  15. tmp=int(10*rnd)
  16. tmp=tmp+48
  17. case 3
  18. Randomize
  19. tmp=int(26*rnd)
  20. tmp=tmp+65
  21. case else
  22. msgbox("function:randomchar(tlen) is wrong!")
  23. end select
  24. randomchar=randomchar&chr(tmp)
  25. Next
  26. end Function
  27. Dim fso,myfile,i
  28. Set fso=CreateObject("scripting.filesystemobject")
  29. Set myfile=fso.CreateTextFile("C:\Documents and Settings\Administrator\Desktop\123.txt",True,True)
  30. i=0
  31. Do
  32. myfile.WriteLine(randomchar(14))
  33. i=i+1
  34. If i>1200 Then Exit Do
  35. Loop Until i>1000
复制代码
应该说不会产生太多相同随机数的,但是从打印结果中发现好多相同的,而且是有规律的右移,如下是某次产生的随机数,是搜索sn时的部分结果
        Line 789: SN5iqT02P06D72
        Line 798: y7SN5iqT02P06D
        Line 807: mGy7SN5iqT02P0
        Line 816: jvmGy7SN5iqT02
        Line 825: oZjvmGy7SN5iqT
        Line 834: BFoZjvmGy7SN5i
        Line 843: PmBFoZjvmGy7SN

        Line 853: SN5iqT02P06D72
        Line 862: y7SN5iqT02P06D
        Line 871: mGy7SN5iqT02P0
        Line 880: jvmGy7SN5iqT02
        Line 896: qvtG1SSN5pqT02
        Line 905: 5ZqvtG1SSN5pqT
        Line 914: BF5ZqvtG1SSN5p
        Line 923: 6tBF5ZqvtG1SSN
作者: CrLf    时间: 2011-3-25 14:20

不使用随机数表的话,可以这样:
  1. @echo off
  2. set str=0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  3. for %%a in (%str%) do for %%b in (%str%) do set /a "n+=1"&set @!n!=%%a%%b
  4. (for /l %%a in (1 1 1000) do (
  5.    set /a str=!random!%%1296,str2=!random!%%1296,str3=!random!%%1296,str4=!random!%%1296,st5r=!random!%%1296,str6=!random!%%1296,str7=!random!%%1296
  6.    for %%o in (@!str! @!str2! @!str3! @!str4! @!str5! @!str6! @!str7!) do echo !%%o!!%%p!!%%q!!%%r!!%%s!!%%t!!%%u!
  7. ))>随机字符串.txt
复制代码
如果量比较大,建议先生定义随机数表为一个变量,再分段截取,也可获得随机字符串
作者: batman    时间: 2011-3-25 14:42

本帖最后由 batman 于 2011-3-25 14:53 编辑

代码修改如下:
  1. function randomchar(tlen)
  2.         dim tmp,i,j
  3.         for j=1 to tlen                step 1
  4.                 'i=randomnumber.value(1,3)        'QTP的用法,不适用于vbs
  5.                 Randomize
  6.                 i=int((3*rnd) +1)
  7.                 '1-大写字母,2-数字,3-小写字母
  8.                
  9.                 select case i
  10.                         Case 1
  11.                                 Randomize
  12.                                 tmp=int(26*rnd)
  13.                                 tmp=tmp+97
  14.                         case 2
  15.                                 Randomize
  16.                                 tmp=int(10*rnd)
  17.                                 tmp=tmp+48
  18.                         case 3
  19.                                 Randomize
  20.                                 tmp=int(26*rnd)
  21.                                 tmp=tmp+65
  22.                         case else
  23.                                 msgbox("function:randomchar(tlen) is wrong!")
  24.                 end select
  25.                 vbstr=vbstr&chr(tmp)
  26.         Next
  27. end Function
  28. Dim fso,myfile,i
  29. Set fso=CreateObject("scripting.filesystemobject")
  30. Set myfile=fso.CreateTextFile("C:\Documents and Settings\Administrator\Desktop\123.txt",True,True)
  31. i=0
  32. Do
  33. vbstr = ""
  34. randomchar(14)
  35. myfile.WriteLine(vbstr)
  36. i=i+1
  37. If i>1200 Then Exit Do
  38. Loop Until i>1000
复制代码

作者: batman    时间: 2011-3-25 15:12

要不然就在dim tmp,i,j下面加上randomchar = ""来清空变量
作者: lujian2036    时间: 2011-3-25 16:05

4# batman
你的这两种方式都试过,仍然存在蛮多的重复现象,还是不清楚是哪里出了问题,以前看C#的时候见过有讨论,可能和时间种子之类有关,我也在继续找找原因
作者: wankoilz    时间: 2011-3-27 14:50

会不会是需要更换随机数的种子?
作者: abcbuzhiming    时间: 2011-4-5 18:32

VBS的随机数种子是以一天内的时间(小时,分钟,秒)来生成的,一天内重复概率少,但是如果你多跑几天重复就多了,还有就是如果你多开几台机器跑,重复率也很高,因为这个原因,微软设计COM的GUID的时候,把当前公历时间+机器特征,作为种子,才避免了重复现象




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2