c#中生成隨機數(shù)的五種方法
在 C# 中,生成隨機數(shù)有多種方式,適用于不同場景。以下是5種主要方法及其對比:
計算機中不存在真正的 "隨機數(shù)",我們生成的隨機數(shù)本質(zhì)是偽隨機數(shù)—— 通過特定算法和初始條件(種子)計算出的序列。這些序列看似無序,但在相同種子下會完全重復(fù),因此也被稱為 "假隨機"。
典型使用場景: 注冊賬號的驗證碼、唯一標(biāo)識符生成、隨機點名器、抽獎系統(tǒng)、游戲中的隨機事件等。
1. 使用Random類(基礎(chǔ)隨機數(shù))
特點:基于種子的偽隨機數(shù)生成器,性能較高,適合普通隨機場景。
示例代碼:
// 創(chuàng)建 Random 實例(默認使用時間戳作為種子) Random random = new Random(); ? // 生成整數(shù):[minValue, maxValue) int randomInt = random.Next(1, 101); // 生成 1 到 100 之間的隨機整數(shù) ? // 生成浮點數(shù):[0.0, 1.0) double randomDouble = random.NextDouble(); // 生成 0.0 到 1.0 之間的隨機小數(shù)
注意事項:
種子問題:短時間內(nèi)創(chuàng)建多個Random實例可能生成相同序列(因時間種子相同)。
// 錯誤示例:每次循環(huán)創(chuàng)建新實例,可能生成相同隨機數(shù)
for (int i = 0; i < 5; i++) {
Console.WriteLine(new Random().Next(100)); // 可能輸出重復(fù)值
}解決方案:復(fù)用單個 Random 實例。
生成隨機字符: 利用 ASCII 碼范圍生成 a-z 的隨機字符串(97-122 對應(yīng)小寫字母):
Random random5 = new Random();
string result = "";
for (int i = 0; i < 4; i++)
{
char c = (char)random5.Next(97, 123); // 生成97-122的隨機數(shù),轉(zhuǎn)換為字符
result += c;
}
Console.WriteLine(result); // 例如:"kqzx"2. 使用System.Random.Shared(線程安全版本)
特點:.NET 6+ 引入的靜態(tài)線程安全隨機數(shù)生成器,無需手動同步。
示例代碼:
// 生成線程安全的隨機數(shù) int safeRandomInt = Random.Shared.Next(1, 101); // 線程安全的整數(shù) double safeRandomDouble = Random.Shared.NextDouble(); // 線程安全的小數(shù)
優(yōu)勢:
- 無需擔(dān)心多線程競爭問題,性能優(yōu)于手動加鎖的
Random。 - 適用于多線程環(huán)境(如并行計算)。
3. 使用System.Security.Cryptography.RandomNumberGenerator(加密安全隨機數(shù))
特點:使用操作系統(tǒng)的加密隨機數(shù)生成器,生成高質(zhì)量隨機數(shù),適用于安全敏感場景(如密碼、令牌生成)。
using System.Security.Cryptography;
?
// 生成加密安全的隨機整數(shù)
byte[] buffer = new byte[4]; // 4字節(jié) = 32位整數(shù)
using (RandomNumberGenerator rng = RandomNumberGenerator.Create()) {
rng.GetBytes(buffer); // 填充隨機字節(jié)
int secureRandomInt = BitConverter.ToInt32(buffer, 0);
Console.WriteLine(Math.Abs(secureRandomInt % 100)); // 轉(zhuǎn)換為 0-99 的整數(shù)
}
?
// 更簡便的寫法(.NET 6+)
int secureInt = RandomNumberGenerator.GetInt32(1, 101); // 直接生成 1-100 的整數(shù)適用場景:
- 密碼學(xué)相關(guān)場景(如生成加密密鑰)。
- 安全令牌、驗證碼生成。
4. GUID(全球唯一標(biāo)識符)
GUID(Globally Unique Identifier)是 128 位的唯一標(biāo)識符,通過系統(tǒng)時間、硬件 ID 等多維度信息計算生成,重復(fù)概率極低(可視為全球唯一)。
核心特點:
- 格式:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx(32 位十六進制數(shù),含連字符),例如:6F9619FF-8B86-D011-B42D-00C04FC964FF。 - 生成方式:直接調(diào)用
Guid.NewGuid()靜態(tài)方法。
適用場景:
生成產(chǎn)品密鑰、訂單號、數(shù)據(jù)庫主鍵、分布式系統(tǒng)中的唯一標(biāo)識等。
Console.WriteLine(Guid.NewGuid()); // 輸出示例:a27fc3ff-f785-4522-bced-7c0f24f0d0e8
5.RNGCryptoServiceProvider(加密級隨機數(shù))
屬于加密安全的隨機數(shù)生成器,基于操作系統(tǒng)底層的加密算法,生成高質(zhì)量隨機數(shù),適用于安全性要求極高的場景。
核心用法:
通過字節(jié)數(shù)組接收隨機數(shù)據(jù),可轉(zhuǎn)換為字符串或數(shù)值使用:
// 創(chuàng)建加密隨機數(shù)生成器實例
using (RNGCryptoServiceProvider rcsp = new RNGCryptoServiceProvider())
{
byte[] bytes = new byte[10]; // 指定隨機數(shù)長度(10字節(jié))
rcsp.GetBytes(bytes); // 生成隨機字節(jié)并填充到數(shù)組
Console.WriteLine(BitConverter.ToString(bytes));
// 輸出示例:3A-7B-2D-...(十六進制格式,以連字符分隔)
}特點:
- 隨機性強:基于硬件或系統(tǒng)環(huán)境的熵值(不可預(yù)測性更高)。
- 線程安全:支持多線程環(huán)境。
- 性能較低:因加密算法復(fù)雜,生成速度慢于
Random。
適用場景:
密碼加密、令牌生成、敏感數(shù)據(jù)加密密鑰等安全敏感場景。
方法對比
| 方法 | 性能 | 線程安全 | 隨機性質(zhì)量 | 適用場景 |
|---|---|---|---|---|
Random | 高 | 否 | 普通(偽隨機) | 游戲、隨機排序、普通模擬 |
System.Random.Shared | 高 | 是 | 普通(偽隨機) | 多線程環(huán)境下的普通隨機需求 |
RandomNumberGenerator | 低 | 是 | 加密安全(真隨機) | 密碼學(xué)、安全令牌、敏感數(shù)據(jù) |
GUID | 高 | 中 | 極高(近乎唯一) | 唯一標(biāo)識(訂單號、主鍵等) |
RNGCryptoServiceProvider | 極高(加密級) | 低 | 高 | 安全場景(密碼、密鑰等) |
總結(jié)
- 普通場景:使用
Random并復(fù)用實例。 - 多線程場景:使用
System.Random.Shared。 - 安全敏感場景:使用
RandomNumberGenerator。
補充說明
Random的擴展用法: 生成隨機字符除了通過 ASCII 碼(97-122 對應(yīng) a-z),還可直接從字符集抽?。?/p>string chars = "qwertyuiopasdfghjklzxcvbnm"; Random ran = new Random(); string res = ""; for (int i = 0; i < 4; i++) { res += chars[ran.Next(chars.Length)]; // 從字符集中隨機取字符 }洗牌算法:
GUID的唯一性: GUID 的唯一性基于 "概率極低",理論上存在重復(fù)可能,但實際應(yīng)用中可視為絕對唯一,無需擔(dān)心沖突。.NET Core/.NET 5 + 的新選擇: 對于加密隨機數(shù),推薦使用
RandomNumberGenerator(.NET 6+)替代RNGCryptoServiceProvider(已過時),用法更簡潔。// .NET 6+ 推薦寫法 byte[] bytes = new byte[10]; RandomNumberGenerator.Fill(bytes); // 填充隨機字節(jié)
到此這篇關(guān)于c#中生成隨機數(shù)的三種方法的文章就介紹到這了,更多相關(guān)c# 生成隨機數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#并發(fā)容器之ConcurrentDictionary與普通Dictionary帶鎖性能詳解
這篇文章主要介紹了C#并發(fā)容器之ConcurrentDictionary與普通Dictionary帶鎖性能詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04
unity3D實現(xiàn)物體任意角度自旋轉(zhuǎn)
這篇文章主要為大家詳細介紹了unity3D實現(xiàn)物體任意角度自旋轉(zhuǎn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-07-07
C#實現(xiàn)連接SQL Server2012數(shù)據(jù)庫并執(zhí)行SQL語句的方法
這篇文章主要介紹了C#實現(xiàn)連接SQL Server2012數(shù)據(jù)庫并執(zhí)行SQL語句的方法,結(jié)合實例形式較為詳細的分析了C#連接SQL Server2012數(shù)據(jù)庫并執(zhí)行查詢、插入等操作的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2017-10-10

