C#生成隨機(jī)數(shù)的方法小結(jié)
本文實(shí)例總結(jié)了C#生成隨機(jī)數(shù)的方法。分享給大家供大家參考。具體分析如下:
開始,很簡(jiǎn)單地使用System.Random類來生成隨機(jī)數(shù)。很快,問題就來了,發(fā)現(xiàn)當(dāng)random的生成間隔小于1ms時(shí),隨機(jī)數(shù)就重復(fù)了(僅限于每次都新建Random對(duì)象),因?yàn)樾陆╮andom時(shí)候是默認(rèn)以當(dāng)前時(shí)間作為隨機(jī)種子的。將random改為單例,重復(fù)數(shù)的幾率小了,但是隨機(jī)數(shù)在一段時(shí)間后循環(huán)了(偽隨機(jī)數(shù)嘛,沒辦法,要求不了這么多的)。
所以,特意在網(wǎng)上找了一些資料,并親自作了一些性能比較,在此作些總結(jié)。
System.Random
這個(gè)是偽隨機(jī)數(shù)生成器
缺點(diǎn):生成出來的結(jié)果會(huì)循環(huán),且Random對(duì)象創(chuàng)建間隔小于1ms的時(shí)候產(chǎn)生結(jié)果會(huì)相同;
優(yōu)點(diǎn):生成速度極快;
效率:高,同一個(gè)對(duì)象產(chǎn)生1,000,000個(gè)結(jié)果只需要22ms(不含對(duì)象創(chuàng)建時(shí)間)
System.Security.Cryptography.RandomNumberGenerator
這個(gè)是用于產(chǎn)生密碼的安全隨機(jī)數(shù)生成器,產(chǎn)生出來的隨機(jī)數(shù)離散度高,產(chǎn)生1,000,000個(gè)32位(8-byte)的隨機(jī)數(shù)無重復(fù)
缺點(diǎn):速度很慢,對(duì)比System.Random是兩個(gè)數(shù)量級(jí)的效率差距;
優(yōu)點(diǎn):安全度高,產(chǎn)生的結(jié)果可看作環(huán)境無關(guān),而且可以填充任意長(zhǎng)度的字節(jié)數(shù)組;
效率:低,同一個(gè)對(duì)象產(chǎn)生1,000,000個(gè)結(jié)果需要4221ms(不含對(duì)象創(chuàng)建時(shí)間)
System.Guid
這個(gè)是GUID(UUID)生成器,出來的是128-bit的字節(jié)數(shù)組,通常被表示為8-4-4-4-12的32個(gè)hex字符。
缺點(diǎn):生成長(zhǎng)度一定,而且生成出來的結(jié)果可能與環(huán)境相關(guān),在高安全需求的環(huán)境不適用;
優(yōu)點(diǎn):有強(qiáng)大的數(shù)學(xué)理論支持,在每秒產(chǎn)生10億筆UUID的情況下,100年后只產(chǎn)生一次重復(fù)的機(jī)率是50%;
效率:中,產(chǎn)生1,000,000個(gè)結(jié)果需要255ms(包含Guid對(duì)象創(chuàng)建時(shí)間)
以上3個(gè)都可以當(dāng)作隨機(jī)數(shù)產(chǎn)生器,但相對(duì)于大部分的業(yè)務(wù)需求, GUID(UUID)已經(jīng)適用,而且其碰撞幾率在同一個(gè)系統(tǒng)內(nèi)幾乎是不可能的。所以在選擇產(chǎn)生器時(shí)GUID是一個(gè)不錯(cuò)的選擇。
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
C#使用Socket實(shí)現(xiàn)發(fā)送和接收?qǐng)D片的方法
這篇文章主要介紹了C#使用Socket實(shí)現(xiàn)發(fā)送和接收?qǐng)D片的方法,涉及C#操作socket發(fā)送與接收文件的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04C#中Thread(線程)和Task(任務(wù))實(shí)例詳解
.NET Framework在System.Threading命名空間中具有與線程相關(guān)的類,線程是一小組可執(zhí)行指令,這篇文章主要給大家介紹了關(guān)于C#中Thread(線程)和Task(任務(wù))的相關(guān)資料,需要的朋友可以參考下2022-03-03c#檢測(cè)端口是否被占用的簡(jiǎn)單實(shí)例
這篇文章主要介紹了c#檢測(cè)端口是否被占用的簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下2013-12-12