隨機數在軟體設計中無處不在:驗證碼產生、模擬測試資料、遊戲邏輯、加密鹽值等。電腦無法產生真正的隨機數,而是透過演算法生成「偽隨機數」。本文深入淺出解析偽隨機數原理,並示範 ASP.NET Framework 內建 Random 類別的多樣化應用技巧。
經典的線性同餘法(Linear Congruential Generator)公式:
Xn+1 = (a × Xn + c) mod m
X0 為種子a 為乘數、c 為增量、m 為模數C 語言經典實作範例:
#define MULTIPLIER 0x015A4E35L
#define INCREMENT 1
unsigned long seed;
void random_seed(unsigned long d) {
seed = (d == 0) ? time(0) : d;
}
unsigned int random(unsigned long low, unsigned long high) {
seed = MULTIPLIER * seed + INCREMENT;
return ((seed >> 16) % (high - low)) + low;
}
.NET System.Random 封裝了上述演算法,提供豐富方法:
| 方法 | 說明 | 範例 |
|---|---|---|
Next() | 非負整數 | rnd.Next() |
Next(max) | 0 到 max-1 | rnd.Next(100) → 0~99 |
Next(min, max) | min 到 max-1 | rnd.Next(1, 7) → 擲骰子 1~6 |
NextDouble() | 0.0 ~ 1.0 雙精度 | 機率計算、蒙地卡羅模擬 |
NextBytes(bytes[]) | 填滿位元組陣列 | 產生隨機金鑰、初始化向量 |
Public Function GenerateCaptcha(length As Integer) As String
Const chars = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"
Dim rnd As New Random()
Dim result As New System.Text.StringBuilder(length)
For i = 1 To length
result.Append(chars(rnd.Next(chars.Length)))
Next
Return result.ToString()
End Function
Public Sub Shuffle(Of T)(list As IList(Of T))
Dim rnd As New Random()
For i = list.Count - 1 To 1 Step -1
Dim j = rnd.Next(i + 1)
Dim temp = list(i)
list(i) = list(j)
list(j) = temp
Next
End Sub
Protected Sub Page_Load(sender As Object, e As EventArgs)
Dim quotes() As String = {"堅持就是勝利", "代碼改變世界", "每天進步一点點"}
Dim rnd As New Random()
lblQuote.Text = quotes(rnd.Next(quotes.Length))
End Sub
掌握偽隨機數原理與 .NET 實作細節,能避開常見坑洞,在模擬、測試、遊戲、安全等場景靈活運用。