隨機數的定義爲:產生的所有數字毫無關係.
在實際應用中很多地方會用到隨機數,比如需要生成唯一的訂單號.
在C#中獲取隨機數有三種方法:
一.Random 類
Random類默認的無參構造函數可以根據當前系統時鐘爲種子,進行一系列算法得出要求範圍內的僞隨機數.
1 | Random rd = new Random(); |
這種隨機數可以達到一些要求較低的目標,但是如果在高併發的情況下,Random類所取到的系統時鐘種子接近甚至完全一樣,就很有可能出現重複,這裏用循環來舉例
1 | for ( int i = 0; i < 10; i++) |
3 | Random rd = new Random(); //無參即爲使用系統時鐘爲種子 |
4 | Console.WriteLine(rd.Next().ToString()); |
這個例子會輸出10個相同的"隨機數".
突顯出的問題:因爲Random進行僞隨機數的算法是固定的,所以根據同一個種子計算出的數字必然是一樣的.而以當代計算機的運行速度,該循環幾乎是在瞬間完成的,種子一致,所以會出現10次循環輸出同一隨機數的情況.
二.Guid 類
System.Guid
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 | RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider(); |
2 | byte [] byteCsp = new byte [10]; |
4 | Console.WriteLine(BitConverter.ToString(byteCsp)); |
因該類使用更嚴密的算法.所以即使如下放在循環中,所計算出的隨機數也是不同的.
1 | for ( int i = 0; i < 10; i++) |
3 | RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider(); |
4 | byte [] byteCsp = new byte [10]; |
6 | Console.WriteLine(BitConverter.ToString(byteCsp)); |
1 | 但是RNGCryptoServiceProvider的計算較爲繁瑣,在循環中使用會消耗造成大量的系統資源開銷,使用時需注意. |
四.?Membership.GeneratePassword?()
Membership是一個方便快捷的進行角色權限管理的類,偶然發現一個很有意思的方法,跟隨機數也擦點邊吧
01 | public static string GeneratePassword( int length, int numberOfNonAlphanumericCharacters); |
07 | // numberOfNonAlphanumericCharacters: |
11 | // 生成的密碼的字符數。長度必須介於 1 和 128 個字符之間。 |
例:
1 | for ( int i = 0; i < 10; i++) |
3 | 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*%
不知是否正好符合你的要求?
沒事可以研究下,有結果別忘了分享下啦 :p
轉自:http://www.cnblogs.com/izanami/archive/2011/04/20/2022173.html