2010-05-21 80 views
4

如何使用randomize和rnd獲取隨機變量的重複列表?在VBA中重複隨機變量

通過重複列表,我的意思是如果你運行一個循環來獲得10個隨機數,列表中的每個隨機數將是唯一的。另外,如果你要再次運行這個序列,你會得到和以前一樣的10個隨機數。

+0

詳細闡述「重複列表」。 – Steven 2010-05-21 19:27:51

回答

11

從微軟自己的嘴巴:

要重複隨機數序列,請使用隨機化與數字參數前帶負參數調用賽第一輪。

查看here瞭解詳情。

全部:


備註

Rnd函數返回一個小於1但大於或等於零的值。

數的值確定如何Rnd產生一個隨機數:

對於任何給定的初始種子,產生相同數目的序列,因爲與Rnd函數每個連續調用使用先前的數作爲下一種子序號中的數字。

在致電Rnd之前,請使用不帶參數的Randomize語句,以基於系統計時器的種子初始化隨機數發生器。

爲了產生隨機整數在給定的範圍內,使用以下公式:

Int((upperbound - lowerbound + 1) * Rnd + lowerbound) 

在此,上界是在範圍內的最高數量,並且下界是在範圍內的最低數目。

注意要重複隨機數序列,請使用Randomize加上一個數字參數前帶負參數調用賽第一輪。使用具有相同數值的隨機數不會重複先前的順序。


舉例來說,如果你把這個代碼到Excel,它會產生不同數量的每次運行時間:

Sub xx() 
    ' x = Rnd(-1) ' 
    Randomize 10 
    MsgBox (Rnd) 
End Sub 

但是,如果取消註釋x = Rnd(-1)線,它所產生的相同每次運行的編號。

請注意,你必須做兩個的東西。請撥打Rnd,並帶有否定參數請撥打Randomize並附上特定參數。改變這些東西會給你一個不同的種子(因此也是序列)。


編輯:

回覆您的評論:

通過重複序列,我的意思是,如果你運行一個循環,以獲得10個隨機數字,列表中的每個隨機數將是獨特。另外,如果你要再次運行這個序列,你會得到和以前一樣的10個隨機數。我所描述的是否有意義?

您現在需要多一條信息。你所要求的不是隨機數,而是一種洗牌算法。我會告訴你我之前給出的關於如何做到這一點的回答here。您只需將洗牌算法與上面詳述的種子設置結合起來,即可獲得可重複的唯一序列。


而這裏有一些代碼表明它在行動。這個子程序的每一次運行都返回序列4 1 5 6 2 3 7 10 9 8,所以我認爲這就是你以後的一個可重複的「隨機」,獨特的序列。如果您希望能夠生成不同的序列(但仍以可重複的方式),則只需更改給予Randomize的值。

Option Explicit 
Option Base 1 

Sub xx() 
    Dim x(10) As Integer 
    Dim xc As Integer 
    Dim xp As Integer 
    Dim i As Integer 
    Dim s As String 

    For i = 1 To 10 
     x(i) = i 
    Next 
    xc = 10 

    i = Rnd(-1) 
    Randomize 1 

    s = "Values:" 
    For i = 1 To 10 
     xp = Int(Rnd * xc) + 1 
     s = s & " " & CStr(x(xp)) 
     x(xp) = x(xc) 
     xc = xc - 1 
    Next i 

    MsgBox (s) 
End Sub 
+0

通過重複序列,我的意思是如果你運行一個循環來獲得10個隨機數,列表中的每個隨機數將是唯一的。另外,如果你要再次運行這個序列,你會得到和以前一樣的10個隨機數。 我所描述的是否有意義? – sooprise 2010-05-21 20:04:25

+0

@Soo,除非我再次誤解,否則這是非常有意義的:-)我已根據評論更新了新信息的答案。 – paxdiablo 2010-05-21 20:32:33

+0

+1因爲我很感激,所以我能夠根據自己的需求來調整這個功能,儘管它的工作原理如何。在添加了「」值後,我無法確定發生了什麼事情:「'到's'。或者,甚至在此之前,那是對於理解它最重要的「數字運算」部分。一般來說,我希望我能看到這個/ VBA的「評估公式」等效步驟。 – ZealousHypocrites 2015-12-11 21:18:11