...">
瀏覽量:145次
如何自動(dòng)生成隨機(jī)數(shù),生成隨機(jī)數(shù)的方法有哪些
在日常工作中,有很多場(chǎng)合需要用到隨機(jī)數(shù)。做實(shí)驗(yàn)時(shí),可能需要一些隨機(jī)數(shù)進(jìn)行檢驗(yàn);很多產(chǎn)品商家需要給產(chǎn)品分配隨機(jī)序列號(hào),或者給VIP用戶卡分配隨機(jī)卡號(hào)。那么,在Windows環(huán)境下,如何才能自動(dòng)生成符合需要的隨機(jī)數(shù)呢?
1.特定區(qū)間內(nèi)普通隨機(jī)數(shù)的生成
如果在實(shí)驗(yàn)過程中需要生成特定區(qū)間的隨機(jī)數(shù),可以先用大家熟悉的Excel軟件創(chuàng)建。RAND和RANDBETWEEN兩個(gè)函數(shù)用于實(shí)現(xiàn)它。
比如你需要生成一個(gè)0到1范圍內(nèi)的隨機(jī)數(shù),可以用函數(shù)“=RAND()”來實(shí)現(xiàn);要生成0到10之間的隨機(jī)數(shù),可以使用函數(shù)表達(dá)式“=rand()* 10”;如果需要1到10之間的隨機(jī)數(shù),使用表達(dá)式“RAND()*(10-1) 1”。同樣,如果需要0到100之間的隨機(jī)數(shù),使用“RAND()*100”函數(shù)表達(dá)式;1到100之間的隨機(jī)數(shù),使用“RAND()*(100-1) 2”函數(shù)表達(dá)式(圖1)。
我們注意到上面的隨機(jī)數(shù)都是小數(shù)。那么,如果你想生成一個(gè)整數(shù)呢?有兩種方式,一種是對(duì)生成的小數(shù)隨機(jī)數(shù)進(jìn)行四舍五入,另一種是直接生成整數(shù)隨機(jī)數(shù)。第一種,比如在表達(dá)式“RAND()*(100-1) 2”上加一個(gè)TRUNC()函數(shù),生成一個(gè)1到100之間的隨機(jī)整數(shù),整個(gè)表達(dá)式表示為“=trunc(RAND()*(100-1)2)”;第二種方法可以直接使用RANDBETWEEN()函數(shù),用表達(dá)式“=RANDBETWEEN(0,10)”生成0到10之間的隨機(jī)整數(shù),用表達(dá)式“=randbetween (50,999)”生成50到9999(圖2)。可以看出,RANDBETWEEN()函數(shù)更加形象,使用起來也更加簡單。
如果你覺得用以上方式生成區(qū)間隨機(jī)數(shù)比較麻煩,可以用第三方工具軟件實(shí)現(xiàn)。比如利用隨機(jī)數(shù)生成器,方便設(shè)置隨機(jī)數(shù)區(qū)域,限制條件,從而自動(dòng)生成符合條件的隨機(jī)數(shù)。
軟件運(yùn)行后,在間隔開始后左上方的兩個(gè)框中輸入隨機(jī)數(shù)生成的范圍值,在小數(shù)點(diǎn)后的位數(shù)后輸入截?cái)嗟男?shù)位數(shù),在要生成的位數(shù)后輸入每次生成的隨機(jī)數(shù)個(gè)數(shù)。然后,單擊Generate integer按鈕生成指定數(shù)量的隨機(jī)整數(shù),單擊Generate decimal生成相應(yīng)的隨機(jī)小數(shù)(圖3)。
設(shè)置好隨機(jī)數(shù)生成條件后,也可以通過快捷鍵完成創(chuàng)建隨機(jī)數(shù)的操作。按功能鍵F1建立指定范圍內(nèi)的整數(shù),按F2生成指定范圍內(nèi)的小數(shù),按F4清除隨機(jī)數(shù)列表。如果要生成大量的隨機(jī)數(shù),要找出某個(gè)特定的隨機(jī)數(shù)是否存在,可以使用Find按鈕查找,然后自動(dòng)定位該隨機(jī)數(shù)(圖4)。要在中間停止生成隨機(jī)數(shù),請(qǐng)按Esc鍵。
提示:如果要生成不重復(fù)的隨機(jī)數(shù),請(qǐng)選中“下一個(gè)隨機(jī)數(shù)不等于當(dāng)前隨機(jī)數(shù)”復(fù)選框。如果想復(fù)制一個(gè)生成的隨機(jī)數(shù)或者隨機(jī)數(shù)列表,可以通過軟件窗口左下角的幾個(gè)按鈕來完成。
2.特定格式產(chǎn)品序列號(hào)的生成
作為產(chǎn)品廠商的工作人員,需要為自己的軟硬件產(chǎn)品安排序列號(hào),或者賣家為客戶的VIP卡配置序列號(hào),也可以通過兩種方法實(shí)現(xiàn)。
首先可以使用Excel的隨機(jī)函數(shù)表達(dá)式。假設(shè)要生成一個(gè)類似“123-456”的由兩個(gè)三位數(shù)和連字符組成的隨機(jī)數(shù)序列,可以使用“=rand between (100,999)-rand between (100,999)”函數(shù)表達(dá)式。其中“,”符號(hào)連接前后的結(jié)果,“-”表示前后兩個(gè)隨機(jī)數(shù)由指定的連字符連接。
同樣,如果要生成一個(gè)由四個(gè)六位數(shù)字組成的隨機(jī)序列號(hào),可以使用"=rand between (100000,99999)-rand between (100000,99999)-rand between (100000,99999)-Rand between (100000,99999)-Rand between (100000,9999)- Rand between(1000000,99999)
序列號(hào)生成也可以使用第三方專用工具,如便攜式ablue scarab軟件CD-key generator軟件。第一次使用軟件時(shí),會(huì)彈出提示,需要進(jìn)行參數(shù)配置。配置參數(shù)主要包括序列號(hào)的段數(shù)和每段的字符數(shù)(圖6)。
進(jìn)入序列號(hào)生成器主窗口后,首先通過下拉列表選擇數(shù)字、字符、數(shù)值字符三種使用方式中的一種,然后通過下面的復(fù)選框選擇是否使用小寫字母,再點(diǎn)擊生成按鈕,創(chuàng)建一組序列號(hào)(圖7)。
提示:雖然該軟件是為CD-Key設(shè)計(jì)的,但生成其他產(chǎn)品序列號(hào)也是適用的。
相關(guān)閱讀:
1.C語言中的算法是由線性同余算法生成的。首先,應(yīng)該設(shè)置seed()。線性同余算法的隨機(jī)性很差,不能滿足加密的要求。
二、windows下隨機(jī)數(shù)的生成:
隨機(jī)數(shù)有兩種產(chǎn)生方式,包括線性自適應(yīng)隨機(jī)數(shù)發(fā)生器和不可預(yù)測(cè)隨機(jī)數(shù)發(fā)生器。
線性自適應(yīng)隨機(jī)發(fā)生器;
在很多編程中,相關(guān)的隨機(jī)函數(shù)都是簡單使用的。例如,在windows下的Microsoft Visual C 6.0中的rand(),在C運(yùn)行時(shí)庫(CRT)中,其定義類似于下面的(為簡潔起見,n省略了多線程程序等。).
int holdrand=1;
int _cdecl rand(void)
{ return((hold rand=hold rand * 214013 l 25310112)16)0x 7 fff };}
這種類型的函數(shù)稱為線性自適應(yīng)函數(shù)。這類函數(shù)的一個(gè)缺點(diǎn)是可預(yù)測(cè)性,因?yàn)樯弦粋€(gè)隨機(jī)數(shù)是下一個(gè)隨機(jī)數(shù)的種子,相關(guān)性很強(qiáng)。與之相關(guān)的兩個(gè)重要事件是:
Netscape Navigator瀏覽器早期版本的攻擊可能是最著名的可預(yù)測(cè)隨機(jī)攻擊,其中用于其SSL(安全套接字層)密鑰的隨機(jī)數(shù)具有很高的可預(yù)測(cè)性,使得SSL變得毫無意義。
另一種是攻擊ASF軟件公司的TexasHoldem撲克應(yīng)用。這個(gè)“授權(quán)”軟件在算法中使用了Borland Delphi的隨機(jī)函數(shù)。這個(gè)隨機(jī)函數(shù)類似于上面提到的CRT中的簡單線性適應(yīng)函數(shù):rand()函數(shù)。
2.不可預(yù)測(cè)的隨機(jī)數(shù)生成器
2.1隨機(jī)數(shù)發(fā)生器的特性
一個(gè)好的(或健壯的)隨機(jī)數(shù)發(fā)生器有以下三個(gè)特點(diǎn):生成平均數(shù);不可預(yù)測(cè)的數(shù)據(jù);取值范圍長且完整(即可以生成大量不同取值的隨機(jī)數(shù),取值范圍內(nèi)的所有值都可以生成)。
線性適應(yīng)函數(shù)產(chǎn)生的隨機(jī)數(shù)只滿足第一個(gè)特性,第二個(gè)特性很差。換句話說,蘭德()
函數(shù)可以生成一系列均勻分布的數(shù)字,但每個(gè)數(shù)字都有很強(qiáng)的可預(yù)測(cè)性。
2.2不可預(yù)測(cè)隨機(jī)發(fā)生器的設(shè)計(jì)
在Windows環(huán)境下,一個(gè)健壯的隨機(jī)函數(shù)是:CryptGenRandom()。它適用于Windows XP、Windows 2000 Professional、Windows NT Workstation 4.0、Windows Me、Windows 98或Windows 95 OSR2或更高版本、Windows Server 2003、Windows 2000 server或Windows 95上的windows nt server 4.0和internet explorer 3.02或更高版本,在Wincrypt.h中定義.
CryptGenRandom從Windows2000的很多資源中獲得它的隨機(jī)性【也叫“熵”】:當(dāng)前進(jìn)程的ID;當(dāng)前線程的ID;系統(tǒng)啟動(dòng)后的時(shí)鐘數(shù);各種高精度性能計(jì)數(shù)器;用戶環(huán)境模塊的MD4(Message Digest 4) hash,包括用戶名、計(jì)算機(jī)名、搜索路徑等。高精度內(nèi)置CPU計(jì)算器,如RDISC、ROMSR、RDPM等。底層系統(tǒng)信息,如空閑時(shí)間、內(nèi)部檢查時(shí)間、中斷時(shí)間、提交限制、頁面計(jì)數(shù)、緩存計(jì)數(shù)、操作系統(tǒng)外部計(jì)數(shù)等。
(cryptgenrandom()函數(shù)的一般用法
首先通過CryptAcquireContext獲取CSP(加密服務(wù)提供商)提供的一個(gè)句柄,定義如下:
BOOL WINAPI CryptAcquireContext(
HCRYPTPROV* phProv,
LPCTSTR pszContainer,
LPCTSTR pszProvider,
DWORD dwProvType,
DWORD雙旗
)
參數(shù)描述:
PhProv:加密服務(wù)提供者(CSP)的句柄指針。
PszContainer:關(guān)鍵字容器的名稱。當(dāng)dwFlags設(shè)置為CRYPT_VERIFYCONTEXT時(shí),pszContainer必須設(shè)置為0。通常,當(dāng)pszContainer為NULL時(shí),會(huì)使用默認(rèn)的密鑰容器名稱。例如,Microsoft Base Cryptographic Provider的用戶當(dāng)前使用其當(dāng)前登錄名作為關(guān)鍵字容器名登錄。
PszProvider:指定的CSP提供程序的名稱,它是以0結(jié)尾的字符串。如果該參數(shù)為空,則使用用戶的默認(rèn)供應(yīng)商。
DwProvType:指定CSP提供程序的類型,值可以如下所示。
PROV_RSA_FULL PROV_SSL
證明_RSA_SIG證明_EC_ECDSA_SIG
PROV_DSS PROV_EC_ECNRA_SIG
PROV_DSS_DH PROV_EC_ECDSA_FULL
PROV _ forte zza PROV _ EC _ EC NRA _ FULL
PROV _ MS _ EXCHANGE PROV _ spy RUS _ LYNKS
PROV_RSA_SCHANNEL
其中,PROV_RSA_FULL表示提供者同時(shí)支持?jǐn)?shù)字簽名和數(shù)據(jù)加密,這是一個(gè)通用設(shè)置(其他具體含義請(qǐng)參考MSDN)。
DwFlags:標(biāo)志值。該參數(shù)通常設(shè)置為零。但是,應(yīng)用程序也可以設(shè)置以下標(biāo)志中的至少一個(gè):CRYPT_VERIFYCONTEXT、CRYPT_NEWKEYSET、CRYPT_MACHINE_KEYSET、CRYPT_DELETEKEYSET(具體含義見MSDN)。
返回值:如果函數(shù)調(diào)用成功,返回值非零(真);否則為0(假)。
調(diào)用CryptGenRandom()函數(shù),將生成的隨機(jī)數(shù)據(jù)填入緩沖區(qū)。
BOOL WINAPI CryptGenRandom(
HCRYPTPROV hProv,
DWORD dwLen,
字節(jié)* pbBuffer
);
參數(shù)描述:
HProv:是一個(gè)來自CSP(加密服務(wù)提供商)的句柄,通過調(diào)用CryptAcquireContext函數(shù)獲得。
DwLen:緩沖區(qū)的大小。
PbBuffer:存儲(chǔ)返回的隨機(jī)數(shù)據(jù)的緩沖區(qū)。
返回值:
真實(shí);如果呼叫成功;否則為假。
使用后釋放句柄和關(guān)鍵字容器:CryptReleaseContext()。
調(diào)用CryptReleaseContext將釋放一個(gè)CSP句柄;同時(shí),每調(diào)用一次,引用計(jì)數(shù)將減1。當(dāng)引用計(jì)數(shù)為零時(shí),CSP上下文將被完全釋放,并且不能再被其他應(yīng)用程序使用。其定義如下:
BOOL WINAPI CryptReleaseContext(
HCRYPTPROV hProv,
DWORD雙旗
);
參數(shù)描述:
HProv:待釋放的CSP手柄
DwFlags:保留,通常設(shè)置為0。
返回值:如果調(diào)用成功,將返回非零值(TRUE)。
[聲明]本網(wǎng)轉(zhuǎn)載網(wǎng)絡(luò)媒體稿件是為了傳播更多的信息,此類稿件不代表本網(wǎng)觀點(diǎn),本網(wǎng)不承擔(dān)此類稿件侵權(quán)行為的連帶責(zé)任。故此,如果您發(fā)現(xiàn)本網(wǎng)站的內(nèi)容侵犯了您的版權(quán),請(qǐng)您的相關(guān)內(nèi)容發(fā)至此郵箱【779898168@qq.com】,我們?cè)诖_認(rèn)后,會(huì)立即刪除,保證您的版權(quán)。
官網(wǎng)優(yōu)化
整站優(yōu)化
渠道代理
400-655-5776