一.Random 類
Random類默認的無參構造函數可以根據當前系統時鍾為種子,進行一系列算法得出要求范圍內的偽隨機數.
Random rd = new Random();
int i = rd.Next([隨機范圍])+[需要再加上的值];
這種隨機數可以達到一些要求較低的目標,但是如果在高並發的情況下,Random類所取到的系統時鍾種子接近甚至完全一樣,就很有可能出現重復,這里用循環來舉例
for (int i = 0; i < 10; i++)
{
Random rd = new Random(); //無參即為使用系統時鍾為種子
Console.WriteLine(rd.Next().ToString());
}
這個例子會輸出10個相同的"隨機數".
突顯出的問題:因為Random進行偽隨機數的算法是固定的,所以根據同一個種子計算出的數字必然是一樣的.而以當代計算機的運行速度,該循環幾乎是在瞬間完成的,種子一致,所以會出現10次循環輸出同一隨機數的情況.
二.Guid 類
System.Guid
GUID (Globally Unique Identifier) 全球唯一標識符 GUID的計算使用到了很多在本機可取到的數字,如硬件的ID碼,當前時間等.所計算出的128位整數(16字節)可以接近唯一的輸出.
Guid.NewGuid().ToString() //只要這一句基本就可以拿到了
計算結果是xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx結構的16進制數字.
三.RNGCryptoServiceProvider 類
System.Security.Cryptography.RNGCryptoServiceProvider
RNGCryptoServiceProvider 使用加密服務提供程序 (CSP) 提供的實現來實現加密隨機數生成器 (RNG)
using System.Security.Cryptography; //需要添加此引用
RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider();
byte[] byteCsp = new byte[10]; //隨機的取值范圍
csp.GetBytes(byteCsp);
Console.WriteLine(BitConverter.ToString(byteCsp));
返回一個xx-xx-xx-xx-xx-xx-xx-xx-xx-xx格式的數據
因該類使用更嚴密的算法.所以即使如下放在循環中,所計算出的隨機數也是不同的.
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的計算較為繁瑣,在循環中使用會消耗造成大量的系統資源開銷,使用時需注意.
