欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c#中生成隨機數(shù)的五種方法

 更新時間:2025年07月27日 09:45:53   作者:張謹(jǐn)?shù)W  
本文主要介紹了c#中生成隨機數(shù)的五種方法,包括Random類(、System.Random.Shared、RandomNumberGenerator、GUID、RNGCryptoServiceProvider,下面就來具體介紹一下每個的適用場景,感興趣的可以了解一下

在 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。

補充說明

  1. 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)]; // 從字符集中隨機取字符
    }

    洗牌算法:

  2. GUID的唯一性: GUID 的唯一性基于 "概率極低",理論上存在重復(fù)可能,但實際應(yīng)用中可視為絕對唯一,無需擔(dān)心沖突。

  3. .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)文章

最新評論