MATLAB - 隨機數



隨機數是從一大組數字中隨機選擇的數字。計算機生成的隨機數稱為偽隨機數。偽隨機數生成利用一種演算法,該演算法內部利用數學公式生成不可預測的隨機數字位。偽隨機數在計算機應用中非常有用,例如遊戲、密碼學等。

Matlab 提供了許多函式,例如 rand、randn 和 randi,可以生成隨機數。對於高階隨機數,我們可以使用 RandStream 類。

另一個函式 randperm 建立整數的隨機排列。

讓我們透過示例來了解每個函式。

使用 rand 函式

rand - 此函式將返回均勻分佈的隨機數。函式的語法如下所述。

語法

a = rand
a = rand(n)
a = rand(sz1, sz2,.....szn)
a = rand(sz)
a = rand(_, typename)
a = rand(_, “like”, p)
a = rand(s,_)
序號 語法和描述
1

a = rand

這將返回一個 0 到 1 之間的隨機數。

2

a = rand(n)

這將返回一個均勻分佈的隨機數。它將是一個 nxn 矩陣。

3

a = rand(sz1, sz2,.....szn)

這將返回一個大小為 sz1 x szn 的均勻分佈的隨機數陣列。

例如,rand(2,3) 返回一個大小為 2×3 的矩陣。因此,隨機數陣列的大小將為 2×3。

4

a = rand(sz)

這裡的向量大小為 sz。該函式將返回一個大小為 sz 的隨機數陣列。例如,rand([2,3]) 將返回一個大小為 2×3 的陣列。

5

a = rand(_, typename)

此處返回的隨機數陣列的型別為 typename。例如,“single”、“double”。

6

a = rand(_, “like”, p)

這將為您提供一個與 p 具有相同資料型別或複雜性(實數或複數)的隨機數陣列。您可以使用 typename 或“like”,但不能同時使用兩者。

7

a = rand(s, _)

隨機數是從流 s 中建立的。您可以使用 RandStream 建立一個流。

讓我們看看上面討論的每種語法的示例。

示例 1

a = rand

執行後的輸出如下:

a = 0.9584

在這個例子中,我們只是呼叫 rand 函式。該值儲存在變數 a 中。

給定的值為 0.9584,生成的數值介於 0 到 1 之間。

讓我們再次呼叫 rand 函式。

a= rand

執行後的輸出如下:

a = 0.075312

再次使用相同的函式,值現在為 0.075312。

示例 2

在這個例子中,我將嘗試使用 n 值呼叫 rand。

a = rand(4)

執行後的輸出如下:

a =

   0.750825   0.930217   0.168903   0.781070
   0.732294   0.017075   0.545846   0.483156
   0.609990   0.311062   0.415960   0.369801
   0.871756   0.556813   0.401244   0.225472

我們傳遞給 rand 的數字是 4。因此,它返回一個大小為 4x4 的矩陣,其中包含如上所示的隨機數。

現在讓我們使用數字 2 並檢視如下所示的 2x2 矩陣:

a = rand(2)

執行後的輸出如下:

a =

   0.8271   0.5491
   0.9997   0.1035

示例 3

在這個例子中,我們將 nxn 矩陣傳遞給 rand 函式。

a = rand(3,3)

執行後的輸出如下:

a =

   0.5684   0.3099   0.4883
   0.7016   0.8126   0.9140
   0.2272   0.4579   0.8909

生成的矩陣大小為 3x3。

讓我們檢查另一個具有 2x4 矩陣的示例。

a = rand(2,4)

執行後的輸出如下:

a =

   0.5362   0.6302   0.8595   0.4848
   0.3148   0.1463   0.6696   0.5108

示例 4

在這個例子中,我們將使用大小為 [3,4] 的向量陣列在 rand 函式中,如下所示

a =  rand([3,4])

執行後的輸出如下:

a =

   8.6458e-01   4.6462e-03   6.8987e-01   5.7768e-01
   7.2335e-01   2.8741e-01   3.4124e-01   7.6021e-02
   2.8896e-01   6.9273e-01   4.4906e-01   8.4528e-01

輸出是一個 3x4 矩陣。

讓我們嘗試另一個具有 [2,2] 向量陣列的示例。

a = rand([2,2])

執行後的輸出如下:

a =

   0.6734   0.4422
   0.4438   0.3153

示例 5

在這個例子中,我們將傳遞 typename 並檢視生成的隨機數的輸出。

a = rand(3,"single")

執行後的輸出如下:

a =

   0.124537   0.265118   0.110287
   0.395455   0.102573   0.826784
   0.062113   0.124306   0.141749

第一個引數是 3,因此它將建立一個 3x3 的單精度 typename 矩陣。

讓我們看看另一個例子

a = rand([2,3], "double")

執行後的輸出如下:

a =

   0.078242   0.617494   0.702426
   0.721792   0.878933   0.199488

在上面的例子中,我們傳遞了一個 [2,3] 向量,它生成一個型別為 double 的 2x3 矩陣。

示例 6

在這個例子中,讓我們首先建立一個大小為 2x2 的單精度矩陣。

p = single([3 2; -2 1])

執行後的輸出如下:

p =

   3   2
  -2   1

現在讓我們在 rand 函式中使用 p,如下所示

a = rand(size(p),"like",p)

執行後的輸出如下:

a =

  2×2 single matrix

    0.1966    0.6160
    0.2511    0.4733

它返回一個大小為 2x2 的隨機數矩陣。

示例 7

在這個例子中,讓我們首先建立一個流,如下所示:

s = RandStream('dsfmt19937')

現在讓我們在 rand 函式中使用流 s,如下所示:

a = rand(s,[3 3])

使用 randn 函式

randn - 此函式與 rand 相同,唯一的區別是它將返回正態分佈的隨機數。函式的語法如下所述。

語法

a = randn
a = randn(n)
a = randn(sz1, sz2,.....szn)
a = randn(sz)
a = randn(_, typename)
a = randn(_, “like”, p)
a = randn(s,_)
序號 語法和描述
1

a = randn

這將從標準正態分佈返回一個隨機標量數。

2

a = rand(n)

這將返回一個來自標準正態分佈的 nxn 矩陣。

3

a = rand(sz1, sz2,.....szn)

這將返回一個大小為 sz1 x szn 的隨機數陣列。

例如,rand(2,3) 返回一個大小為 2x3 的矩陣。因此,隨機數陣列的大小將為 2x3。

4

a = rand(sz)

這裡的向量大小為 sz。該函式將返回一個大小為 sz 的隨機數陣列。例如,rand([2,3]) 將返回一個大小為 2x3 的陣列。

5

a = rand(_, typename)

此處返回的隨機數陣列的型別為 typename。例如,“single”、“double”。

6

a = rand(_, “like”, p)

這將為您提供一個與 p 具有相同資料型別或複雜性(實數或複數)的隨機數陣列。您可以使用 typename 或“like”,但不能同時使用兩者。

7

a = rand(s, _)

隨機數是從流 s 中建立的。您可以使用 RandStream 建立一個流。

讓我們看看上面討論的每種語法的示例。

示例 1

a = randn

執行後的輸出如下:

a = -0.1226

在這個例子中,我們只是呼叫 randn 函式。該值儲存在變數 a 中。

給定的值為 0.5377,該值是從標準正態分佈生成的,即它的均值為 0,標準差為 1。

示例 2

在這個例子中,我將嘗試使用 n 值呼叫 randn。

a = randn(2)

執行後的輸出如下:

a =

   0.1708  -0.9527
   1.8627   2.8103

我們傳遞給 randn 的數字是 2。因此,它返回一個大小為 2x2 的矩陣,其中包含如上所示的隨機數。

示例 3

在這個例子中,我們將 nxn 矩陣傳遞給 rand 函式。

a = randn(3,3)

執行後的輸出如下:

a =

   0.067762   0.519480  -0.568026
   0.267630   0.232140  -1.267290
   0.808611   1.462018   1.039429

生成的矩陣大小為 3x3。

示例 4

在這個例子中,我們將使用大小為 [3,4] 的向量陣列在 randn 函式中,如下所示

a = randn([3,4])

執行後的輸出如下:

a =

  -0.2043  -0.4831  -0.4446   0.4228
   0.2926   2.2891   1.5870   0.3228
   0.4624  -1.0989   1.2035  -0.4612

輸出是一個 3x4 矩陣。

示例 5

在這個例子中,我們將傳遞 typename 並檢視生成的隨機數的輸出。

a = randn(3,"single")

執行後的輸出如下:

a =

   1.6072  -0.4121   0.2886
   0.7244   1.3422   0.9589
   0.9034   0.6775  -0.5273

第一個引數是 3,因此它將建立一個 3x3 的單精度 typename 矩陣。

示例 6

在這個例子中,讓我們首先建立一個大小為 2x2 的單精度矩陣。

p = single([3 2; -2 1])

執行後的輸出如下:

p =

   3   2
  -2   1

現在讓我們在 rand 函式中使用 p,如下所示

a = randn(size(p),"like",p)

它返回一個大小為 2x2 的隨機數矩陣。

示例 7

在這個例子中,讓我們首先建立一個流,如下所示:

s = RandStream('dsfmt19937')

現在讓我們在 randn 函式中使用流 s,如下所示

a = randn(s,[3 3])

使用 randi 函式

randi - 處理均勻分佈的偽隨機整數。

語法

a = randi(imax)
a = randi(imax,n)
a = randi(imax,sz1,...,szN)
a = randi(imax,sz)
a = randi(___,typename)
a = randi(___,"like",p)
a = randi([imin,imax],___)
a = randi(s,___)
序號 語法和描述
1

a = randi(imax)

這將返回一個介於 0 到 imax 之間的偽隨機標量整數。

2

a = randi(imax,n)

這將返回一個 nxn 矩陣,其中包含介於 [1, imax] 之間的整數。

3

a = randi(imax,sz1,...,szN)

這將返回一個大小為 sz1 x szn 的隨機整數陣列。

例如,randi(10, 2,3) 返回一個大小為 2x3 的矩陣,其中包含介於 1 到 10 之間的偽隨機整數。

4

a = randi(imax,sz)

這裡的向量大小為 sz。該函式將返回一個大小為 sz 的隨機整數陣列。例如,randi(10, [2,3]) 將返回一個大小為 2x3 的陣列,其中包含介於 1 到 10 之間的隨機整數。

5

a = randi(_, typename)

介於 1 到 imax 之間的隨機整數陣列,型別為 typename。例如,“single”、“double”、“int8”、“uint8”、“int16”、“uint16”、“int32”、“uint32”或“logical”。

6

a = rand(_, “like”, p)

這將為您提供一個偽隨機整數陣列,類似於 p 或複雜度(實數或複數)類似於 p。您可以使用 typename 或“like”,但不能同時使用兩者。

7

a = randi([imin,imax],___)

這將返回一個偽隨機整數陣列,該陣列位於 imin 和 imax 指定的區間內。

8

a = rand(s, _)

隨機數由流s建立。您可以使用 RandStream 建立流。

示例 1

在這個例子中,讓我們看看 a = randi(imax) 的輸出。

a = randi(6)

執行後的輸出如下:

a = 2

示例 2

在這個例子中,我們將看到 a = randi(imax,n) 的輸出。

a = randi(5,3)

執行後的輸出如下:

a =

   5   1   5
   1   4   1
   5   2   5

示例 3

讓我們檢查 a = randi(imax,sz1,...,szN) 的輸出。

這裡 imax 將使用 8,矩陣大小將為 2,3。

a = randi(8,2,3)

執行後的輸出如下:

a =

   7   4   2
   2   4   5

示例 4

讓我們檢查 a = randi(imax,sz) 的輸出。

這裡 imax 將使用 8,矩陣大小將為 [2,3]。

a = randi(8,[2,3])

執行後的輸出如下:

a =

   6   7   5
   2   7   3

示例 5

在這個例子中,我們將傳遞 typename 並檢視生成的隨機整數的輸出。

a = randi(5, "int32")

執行後的輸出如下:

a = 3

示例 6

在這個例子中,我們將傳遞 typename 並檢視生成的隨機整數的輸出。

a = randi(10,size(p),"like",p)

示例 7

在這個例子中,讓我們檢查 imin 和 imax 區間內的偽隨機整數。

r = randi([1,5],3,3)  

執行後的輸出如下:

r =

   3   2   3
   4   1   1
   1   4   1

imin 為 1,imax 為 5。大小為 3x3 的矩陣是從區間 [1,5] 生成的。

示例 8

在這個例子中,讓我們首先建立一個流,如下所示:

s = RandStream('dsfmt19937')

如下所示,流在 randi 函式中使用。

a = randi(s,[1,10],[2 3])

使用 randperm 函式

randperm − 隨機數透過整數的隨機排列生成。

語法

a = randperm(n)
a = randperm(n,k)
a = randperm(s,___)
序號 語法和描述
1

a = randperm(n)

這將返回一個行向量,該向量包含 1 到 n 的排列整數,並且不會重複任何值。

2

a = randperm(n,k)

這將返回一個行向量,該向量包含從 1 到 n 的排列中隨機選擇的 k 個唯一整數。

3

a = randperm(s,___)

隨機排列生成基於隨機數流 s 的整數。

示例 1

在這個例子中,我們將檢視使用 a = randperm(n) 生成的輸出。我們將使用 n 為 10。因此排列將從 1 到 10 進行。

a = randperm(10)

執行後的輸出如下:

a =

    8    7    5    4   10    6    2    1    3    9

示例 2

讓我們檢查從函式 a = randperm(n,k) 返回的 k 個唯一整數的行向量。其中 k = 5,n = 10。

a = randperm(10,5)

執行後的輸出如下:

a =

    1    2   10    5    4

示例 3

在這個例子中,讓我們使用流進行排列。

s = RandStream('dsfmt19937')

現在讓我們在 a = randperm(s,___) 中使用流。

a = randperm(s,6)
廣告