C#中獲取、生成隨機(jī)數(shù)的三種方法
隨機(jī)數(shù)的定義為:產(chǎn)生的所有數(shù)字毫無關(guān)系.
在實(shí)際應(yīng)用中很多地方會(huì)用到隨機(jī)數(shù),比如需要生成唯一的訂單號(hào).
在C#中獲取隨機(jī)數(shù)有三種方法:
一.Random 類
Random類默認(rèn)的無參構(gòu)造函數(shù)可以根據(jù)當(dāng)前系統(tǒng)時(shí)鐘為種子,進(jìn)行一系列算法得出要求范圍內(nèi)的偽隨機(jī)數(shù).
Random rd = new Random();
int i = rd.Next();
這種隨機(jī)數(shù)可以達(dá)到一些要求較低的目標(biāo),但是如果在高并發(fā)的情況下,Random類所取到的系統(tǒng)時(shí)鐘種子接近甚至完全一樣,就很有可能出現(xiàn)重復(fù),這里用循環(huán)來舉例
for (int i = 0; i < 10; i++)
{
Random rd = new Random(); //無參即為使用系統(tǒng)時(shí)鐘為種子
Console.WriteLine(rd.Next().ToString());
}
這個(gè)例子會(huì)輸出10個(gè)相同的"隨機(jī)數(shù)".
突顯出的問題:因?yàn)镽andom進(jìn)行偽隨機(jī)數(shù)的算法是固定的,所以根據(jù)同一個(gè)種子計(jì)算出的數(shù)字必然是一樣的.而以當(dāng)代計(jì)算機(jī)的運(yùn)行速度,該循環(huán)幾乎是在瞬間完成的,種子一致,所以會(huì)出現(xiàn)10次循環(huán)輸出同一隨機(jī)數(shù)的情況.
二.Guid 類
System.Guid
GUID (Globally Unique Identifier) 全球唯一標(biāo)識(shí)符
GUID的計(jì)算使用到了很多在本機(jī)可取到的數(shù)字,如硬件的ID碼,當(dāng)前時(shí)間等.所計(jì)算出的128位整數(shù)(16字節(jié))可以接近唯一的輸出.
Console.WriteLine(Guid.NewGuid().ToString());
計(jì)算結(jié)果是xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx結(jié)構(gòu)的16進(jìn)制數(shù)字.當(dāng)然這個(gè)格式也是可以更改的.
三.RNGCryptoServiceProvider 類
System.Security.Cryptography.RNGCryptoServiceProvider
RNGCryptoServiceProvider 使用加密服務(wù)提供程序 (CSP) 提供的實(shí)現(xiàn)來實(shí)現(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ì)算出的隨機(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的計(jì)算較為繁瑣,在循環(huán)中使用會(huì)消耗造成大量的系統(tǒng)資源開銷,使用時(shí)需注意.''
Membership.GeneratePassword()
Membership是一個(gè)方便快捷的進(jìn)行角色權(quán)限管理的類,偶然發(fā)現(xiàn)一個(gè)很有意思的方法,沒研究過是如何實(shí)現(xiàn)的
public static string GeneratePassword(int length, int numberOfNonAlphanumericCharacters);
//
// 摘要:
// 生成指定長(zhǎng)度的隨機(jī)密碼。
//
// 參數(shù):
// numberOfNonAlphanumericCharacters:
// 生成的密碼中的標(biāo)點(diǎn)字符數(shù)。
//
// length:
// 生成的密碼的字符數(shù)。長(zhǎng)度必須介于 1 和 128 個(gè)字符之間。
//
// 返回結(jié)果:
// 指定長(zhǎng)度的隨機(jī)密碼。
例:
for (int i = 0; i < 10; i++)
{
Response.Write(Membership.GeneratePassword(20, 1) + "<br>");
}
結(jié)果為
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*%
不知是否正好符合你的要求?
相關(guān)文章
c#使用win32api實(shí)現(xiàn)獲取光標(biāo)位置
本文給大家匯總了2個(gè)使用C#實(shí)現(xiàn)獲取光標(biāo)位置的代碼,非常的簡(jiǎn)單實(shí)用,第二種方法更為全面,推薦給大家。2016-02-02WinForm開發(fā)中屏蔽WebBrowser腳本錯(cuò)誤提示的方法
這篇文章主要介紹了WinForm開發(fā)中屏蔽WebBrowser腳本錯(cuò)誤提示的方法,在C#項(xiàng)目開發(fā)中比較實(shí)用,需要的朋友可以參考下2014-08-08C#解決多IfElse判斷語(yǔ)句和Switch語(yǔ)句問題的方法分享
這篇文章主要為大家介紹C#如何使用設(shè)計(jì)模式中的策略模式和委托來解決多個(gè)IfElse判斷語(yǔ)句和Switch語(yǔ)句,這種替換方式在其他語(yǔ)言也一樣可以做到,感興趣的可以了解一下2022-12-12C#實(shí)現(xiàn)HSL顏色值轉(zhuǎn)換為RGB的方法
這篇文章主要介紹了C#實(shí)現(xiàn)HSL顏色值轉(zhuǎn)換為RGB的方法,涉及C#數(shù)值判定與轉(zhuǎn)換的相關(guān)技巧,需要的朋友可以參考下2015-06-06