的Chr(Int(Rnd(1) * 26) + 97)
目的是挑選的範圍內的隨機字符「a」到「Z」。它的工作原理是,「a」的ascii代碼是97,其餘的字母順序依次排列。因此,對於環積聚隨機小寫其長度的字符串某處1和20
typext = "execombatbmpjpggifdocxlsppthtmhtthta"
之間
是33 = 3x11字符的字符串。連續的三元組是共同的文件擴展名,「執行」,「COM」,「球棒」等的表達的那些三元
Mid(typext, ((tmpext - 1) * 3) + 1, 3)
提取物之一。
這段代碼有很多問題。
1)Randomize (Timer)
所述第一時間是不必要的冗長。 Randomize
本身將隨機數發生器與系統時間結合在一起 - 除非您希望能夠在未來再現隨機數字流,否則您不需要傳遞任何數字,這裏就不是這種情況。
2)Randomize (Timer)
第二次和第三次是真的毫無意義。由於Timer
的分辨率爲1毫秒,因此再次使用該行可能會將隨機數生成器重置爲完全相同的種子。因此該行的重複可以減少輸出中隨機性的數量。
3)在Rnd(1)
的1
是沒有意義的。它具有完全相同的輸出一樣Rnd
4)爲什麼硬線在11個具體的文件擴展名,爲什麼限制自己的文件長度爲3的擴展?有一個文件擴展名數組,然後選擇一個數組的隨機元素更有意義。喜歡的東西:
typext = Array("exe","com","bat","bmp","jpg", "gif", "doc", "xls","ppt", "htm", "htt", "hta")
r = Int(Rnd * (1+ UBound(typext)))
tmpname=tmpname & "." & typext(r) & ".vbs"
這樣,您可以自由其他條目添加到陣列,包括像「C」,而其餘代碼將工作。
這裏是一個清理的版本,寫成一個函數:
Function RandFileName()
Dim tmpname, namel, lettre, tmpext, typext, r
Randomize
tmpname = ""
namel = Int(Rnd(1) * 20) + 1
For lettre = 1 To namel
tmpname = tmpname & Chr(Int(Rnd(1) * 26) + 97)
Next
typext = Array("exe", "com", "bat", "bmp", "jpg", "gif", "doc", "xls", "ppt", "htm", "htt", "hta")
r = Int(Rnd * (1 + UBound(typext)))
tmpname = tmpname & "." & typext(r) & ".vbs"
RandFileName = tmpname
End Function
典型輸出:bgwkxjvaapr.exe.vbs
MID(typext,((tmpext - 1)* 3)+ 1,3) 以上的數字是如何提取這些擴展名的?這樣的乘法和加法將如何產生這樣的結果? – Akki
中間參數'((tmpext - 1)* 3)+ 1'的值爲1,4,7,...,31之一(取決於隨機值tmpext)。例如,如果'tmpext'是2,那麼這將評估爲7,然後'Mid(typext,7,3)'將提取從位置7開始的3個字符。這將是子字符串「bat」。正如我在答覆中所表明的那樣,我認爲這不是一個好辦法。我提到我認爲它太不靈活。這也是不必要的晦澀難懂。 –
由於減1,在上面的評論中,我應該說,如果'tmpext'是* 3 *那麼表達式計算爲7 ... –