C#中獲取隨機數有三種方法

隨機數的定義爲:產生的全部數字毫無關係.算法

在實際應用中不少地方會用到隨機數,好比須要生成惟一的訂單號.併發

在C#中獲取隨機數有三種方法:dom

 

一.Random 類ide

Random類默認的無參構造函數能夠根據當前系統時鐘爲種子,進行一系列算法得出要求範圍內的僞隨機數.函數

1
2
Random rd =  new  Random();
int  i = rd.Next();

這種隨機數能夠達到一些要求較低的目標,可是若是在高併發的狀況下,Random類所取到的系統時鐘種子接近甚至徹底同樣,就頗有可能出現重複,這裏用循環來舉例高併發

1
2
3
4
5
for  ( int  i = 0; i < 10; i++)
{
     Random rd =  new  Random();   //無參即爲使用系統時鐘爲種子
     Console.WriteLine(rd.Next().ToString());
}

這個例子會輸出10個相同的"隨機數".ui

突顯出的問題:由於Random進行僞隨機數的算法是固定的,因此根據同一個種子計算出的數字必然是同樣的.而以當代計算機的運行速度,該循環幾乎是在瞬間完成的,種子一致,因此會出現10次循環輸出同一隨機數的狀況.加密

 

二.Guid 類spa

System.Guidcode

GUID (Globally Unique Identifier) 全球惟一標識符

GUID的計算使用到了不少在本機可取到的數字,如硬件的ID碼,當前時間等.所計算出的128位整數(16字節)能夠接近惟一的輸出.

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

 

計算結果是xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx結構的16進制數字.固然這個格式也是能夠更改的.

 

三.RNGCryptoServiceProvider 類

System.Security.Cryptography.RNGCryptoServiceProvider 

RNGCryptoServiceProvider 使用加密服務提供程序 (CSP) 提供的實現來實現加密隨機數生成器 (RNG)

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

因該類使用更嚴密的算法.因此即便以下放在循環中,所計算出的隨機數也是不一樣的.

1
2
3
4
5
6
7
for  ( int  i = 0; i < 10; i++)
{
     RNGCryptoServiceProvider csp =  new  RNGCryptoServiceProvider();
     byte [] byteCsp =  new  byte [10];
     csp.GetBytes(byteCsp);
     Console.WriteLine(BitConverter.ToString(byteCsp));
}
1
可是RNGCryptoServiceProvider的計算較爲繁瑣,在循環中使用會消耗形成大量的系統資源開銷,使用時需注意.

 

Membership.GeneratePassword()

Membership是一個方便快捷的進行角色權限管理的類,偶然發現一個頗有意思的方法,沒研究過是如何實現的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public  static  string  GeneratePassword( int  length,  int  numberOfNonAlphanumericCharacters);
//
// 摘要:
//     生成指定長度的隨機密碼。
//
// 參數:
//   numberOfNonAlphanumericCharacters:
//     生成的密碼中的標點字符數。
//
//   length:
//     生成的密碼的字符數。長度必須介於 1 和 128 個字符之間。
//
// 返回結果:
//     指定長度的隨機密碼。



例:

1
2
3
4
for  ( int  i = 0; i < 10; i++)
{
     Response.Write(Membership.GeneratePassword(20, 1) +  "<br>" );
}

 

結果爲

C!&^HoTNv3!ZHkK9BAbu

azLgER)JJ-UW8q*14yz*

I3qnb]Zxu16ht!kKZ!Q*

9U:MAQ&c1x)^aed@xe**

oL(%4JvfbP&t5*Hpl4l-

6@zj$CnhW&D+|xOf:qIk

A/!Di&l*tY$QaMH0gyzY

z^wu6{1BMq7D^+WU]>f$

1OgIJS3&09fw0F9.|aXA

8F+Gy+L{O6x{SfugME*%

相關文章
相關標籤/搜索