c#隨機(jī)數(shù)生成方法

2022-09-14 09:59 更新

在C#中,要生成隨機(jī)數(shù)的方法有好幾種,其中下面三種是最常使用到的。

  1. 使用Random 類
  2. 使用Guid 類
  3. 使用RNGCryptoServiceProvider 類

1、使用Random 類

Random類默認(rèn)的無參構(gòu)造函數(shù)可以根據(jù)當(dāng)前系統(tǒng)時鐘為種子,進(jìn)行一系列算法得出要求范圍內(nèi)的偽隨機(jī)數(shù)

Random rd = new Random()
rd.next(1,10)(生成1~10之間的隨機(jī)數(shù),不包括10)

以上是求10以內(nèi)隨機(jī)數(shù)的例子,這種隨機(jī)數(shù)可以達(dá)到一些要求較低的目標(biāo),但是如果在高并發(fā)的情況下,Random類所取到的系統(tǒng)時鐘種子接近甚至完全一樣,就很有可能出現(xiàn)重復(fù),這里用循環(huán)來舉例

for(int i=0;i<10;i++){
    Random rd = new Random();
    Console.WriteLine(rd.Next(10,100).ToString());
}

這個例子會得到10個相同的隨機(jī)數(shù),應(yīng)循環(huán)完成的時間是非常短,所以根據(jù)系統(tǒng)時間作為種子算出的隨機(jī)數(shù)就會是一樣的。所以Random循環(huán)只適用于要求比較低的情況。


2、使用Guid 類

System.Guid

GUID (Globally Unique Identifier) 全球唯一標(biāo)識符

GUID的計算使用到了很多在本機(jī)可取到的數(shù)字,如硬件的ID碼,當(dāng)前時間等.所計算出的128位整數(shù)(16字節(jié))可以接近唯一的輸出.

Console.WriteLine(Guid.NewGuid().ToString());

計算結(jié)果是xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx結(jié)構(gòu)的16進(jìn)制數(shù)字.當(dāng)然這個格式也是可以更改的.常用的四種格式:

 var uuid = Guid.NewGuid().ToString(); // 9af7f46a-ea52-4aa3-b8c3-9fd484c2af12
 var uuidN = Guid.NewGuid().ToString("N"); // e0a953c3ee6040eaa9fae2b667060e09 
 var uuidD = Guid.NewGuid().ToString("D"); // 9af7f46a-ea52-4aa3-b8c3-9fd484c2af12
 var uuidB = Guid.NewGuid().ToString("B"); // {734fd453-a4f8-4c5d-9c98-3fe2d7079760}
 var uuidP = Guid.NewGuid().ToString("P"); //  (ade24d16-db0f-40af-8794-1e08e2040df3)
 var uuidX = Guid.NewGuid().ToString("X"); // {0x3fa412e3,0x8356,0x428f,{0xaa,0x34,0xb7,0x40,0xda,0xaf,0x45,0x6f}}

3、使用RNGCryptoServiceProvider 類

System.Security.Cryptography.RNGCryptoServiceProvider 

RNGCryptoServiceProvider 使用加密服務(wù)提供程序 (CSP) 提供的實現(xiàn)來實現(xiàn)加密隨機(jī)數(shù)生成器 (RNG)

RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider();
byte[] byteCsp = new byte[10];
csp.GetBytes(byteCsp);
Console.WriteLine(BitConverter.ToString(byteCsp));

因該類使用更嚴(yán)密的算法.所以即使如下放在循環(huán)中,所計算出的隨機(jī)數(shù)也是不同的.

for (int i = 0; i < 10; i++){
    RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider();
    byte[] byteCsp = new byte[10];
    csp.GetBytes(byteCsp);
    Console.WriteLine(BitConverter.ToString(byteCsp));
}

但是RNGCryptoServiceProvider的計算較為繁瑣,在循環(huán)中使用會消耗造成大量的系統(tǒng)資源開銷,使用時需注意.


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號