生成隨機數幾種方式
在shell中有一個環境變量RANDOM,它的范圍是0--32767
1、如果我們想要產生0-25范圍內的數,如何做呢?如下:
用這個環境變量對26取模,就可以得到最小是0,最大是25的數了。
2、如果想得到1--68范圍內的數,可以這樣
前面可以得到最小為0,最大為67的隨機數,再加上1,很自然的就可以得到最大為1,最小為68的數了。
3、如果想得到6--87范圍內的數。可以這樣
前面可以得到最小為0,最大為81的隨機數,再加上6,很自然的就可以得到最大為87,最小為6的數了。
通過上面三個例子,其它范圍內的數一樣可以用這種方法產生,總結出規律來
可以類推其它范圍內數了
介紹:
1、/dev/random和/dev/urandom是Linux系統中提供的隨機偽設備,這兩個設備的任務,是提供永不為空的隨機字節數據流。很多解密程序與安全應用程序(如SSH Keys,SSL Keys等)需要它們提供的隨機數據流。
2、這兩個設備的差異在于:/dev/random的random pool依賴于系統中斷,因此在系統的中斷數不足時,/dev/random設備會一直封鎖,嘗試讀取的進程就會進入等待狀態,直到系統的中斷數充分夠用, /dev/random設備可以保證數據的隨機性。/dev/urandom不依賴系統的中斷,也就不會造成進程忙等待,但是數據的隨機性也不高。
3、dev/urandom 和dev/random,都是產生用不為空的隨機字符流,區別是
/dev/random設備會封鎖,直到系統產生的隨機字符流已經充分夠用,所以耗用時間較長
/dev/urandom設備不會封鎖,數據的隨機程度不高,但是一般情況已經夠用
4、使用/dev/random比使用/dev/urandom產生大量隨機數的速度要慢
通過過濾賽選可以取出隨機數或隨機字母如下
產生隨機字母方式:
NbvFFlhs
[root@centos7 bin]#
產生隨機數字方式
用途:
用來產生偽隨機字節。隨機數字產生器需要一個ed,先已經說過了,在沒有/dev/srandom系統下的解決方法是自己做一個~/.rnd文件。如果該程序能讓隨機數字產生器很滿意的被eded。程序寫回一些怪怪的東西回該文件。
用法:
選項說明:
-out file:結果輸出到file中。
-rand file(s):指定隨機數種子文件,多個文件間用分隔符分開,windows用“;”,OpenVMS用“,“,其他系統用“:”。
-ba64:輸出結果為BASE64編碼數據。
-hex:輸出結果為16進制數據。
num:隨機數長度。
實例:
可以看見,這12個字節的隨機數顯示為亂碼,可以對隨機字符串進行ba64編碼或用hex格式顯示
通過過濾賽選可以取出隨機數或隨機字母如下
產生隨機字母方式:
產生隨機數字方式
四、應用
字體加顏色
\033[33m 字符 \033[0m [[31m 字符 [[0m
隨機顏色
color= RANDOM%8+31]
\033[${color}m 字符 \033[0m
存放顏色案例的文件
cat /etc/DIR_COLORS
c語言,如何產生隨機數?
本文由青松原創并依GPL-V2及其后續版本發放,轉載請注明出處且應包含本行聲明。\x0d\x0a\x0d\x0aC++中常用rand()函數生成隨機數,但嚴格意義上來講生成的只是偽隨機數(pudo-random integral number)。生成隨機數時需要我們指定一個種子,如果在程序內循環,那么下一次生成隨機數時調用上一次的結果作為種子。但如果分兩次執行程序,那么由于種子相同,生成的“隨機數”也是相同的。\x0d\x0a\x0d\x0a在工程應用時,我們一般將系統當前時間(Unix時間)作為種子,這樣生成的隨機數更接近于實際意義上的隨機數。給一下例程如下:\x0d\x0a\x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0ausing namespace std;\x0d\x0a\x0d\x0aint main()\x0d\x0a{\x0d\x0a double random(double,double);\x0d\x0a srand(unsigned(time(0)));\x0d\x0a for(int icnt = 0; icnt != 10; ++icnt)\x0d\x0a cout << "No." << icnt+1 << ": " << int(random(0,10))<< endl;\x0d\x0a return 0;\x0d\x0a}\x0d\x0a\x0d\x0adouble random(double start, double end)\x0d\x0a{\x0d\x0a return start+(end-start)*rand()/(RAND_MAX + 1.0);\x0d\x0a}\x0d\x0a/* 運行結果\x0d\x0a* No.1: 3\x0d\x0a* No.2: 9\x0d\x0a* No.3: 0\x0d\x0a* No.4: 9\x0d\x0a* No.5: 5\x0d\x0a* No.6: 6\x0d\x0a* No.7: 9\x0d\x0a* No.8: 2\x0d\x0a* No.9: 9\x0d\x0a* No.10: 6\x0d\x0a*/\x0d\x0a利用這種方法能不能得到完全意義上的隨機數呢?似乎9有點多哦?卻沒有1,4,7?!我們來做一個概率實驗,生成1000萬個隨機數,看0-9這10個數出現的頻率是不是大致相同的。程序如下:\x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0ausing namespace std;\x0d\x0a\x0d\x0aint main()\x0d\x0a{\x0d\x0a double random(double,double);\x0d\x0a int a[10] = ;\x0d\x0a const int Gen_max = 10000000;\x0d\x0a srand(unsigned(time(0)));\x0d\x0a \x0d\x0a for(int icnt = 0; icnt != Gen_max; ++icnt)\x0d\x0a switch(int(random(0,10)))\x0d\x0a {\x0d\x0a ca 0: a[0]++; break;\x0d\x0a ca 1: a[1]++; break;\x0d\x0a ca 2: a[2]++; break;\x0d\x0a ca 3: a[3]++; break;\x0d\x0a ca 4: a[4]++; break;\x0d\x0a ca 5: a[5]++; break;\x0d\x0a ca 6: a[6]++; break;\x0d\x0a ca 7: a[7]++; break;\x0d\x0a ca 8: a[8]++; break;\x0d\x0a ca 9: a[9]++; break;\x0d\x0a default: cerr << "Error!" << endl; exit(-1);\x0d\x0a }\x0d\x0a \x0d\x0a for(int icnt = 0; icnt != 10; ++icnt)\x0d\x0a cout << icnt << ": " << tw(6) << tiosflags(ios::fixed) << tprecision(2) << double(a[icnt])/Gen_max*100 << "%" << endl;\x0d\x0a \x0d\x0a return 0;\x0d\x0a}\x0d\x0a\x0d\x0adouble random(double start, double end)\x0d\x0a{\x0d\x0a return start+(end-start)*rand()/(RAND_MAX + 1.0);\x0d\x0a}\x0d\x0a/* 運行結果\x0d\x0a* 0: 10.01%\x0d\x0a* 1: 9.99%\x0d\x0a* 2: 9.99%\x0d\x0a* 3: 9.99%\x0d\x0a* 4: 9.98%\x0d\x0a* 5: 10.01%\x0d\x0a* 6: 10.02%\x0d\x0a* 7: 10.01%\x0d\x0a* 8: 10.01%\x0d\x0a* 9: 9.99%\x0d\x0a*/\x0d\x0a可知用這種方法得到的隨機數是滿足統計規律的。\x0d\x0a\x0d\x0a另:在Linux下利用GCC編譯程序,即使我執行了1000000次運算,是否將random函數定義了inline函數似乎對程序沒有任何影響,有理由相信,GCC已經為我們做了優化。但是冥冥之中我又記得要做inline優化得加O3才行...\x0d\x0a\x0d\x0a不行,于是我們把循環次數改為10億次,用time命令查看執行時間:\x0d\x0achinsung@gentoo ~/workspace/test/Debug $ time ./test \x0d\x0a0: 10.00%\x0d\x0a1: 10.00%\x0d\x0a2: 10.00%\x0d\x0a3: 10.00%\x0d\x0a4: 10.00%\x0d\x0a5: 10.00%\x0d\x0a6: 10.00%\x0d\x0a7: 10.00%\x0d\x0a8: 10.00%\x0d\x0a9: 10.00%\x0d\x0a\x0d\x0areal 2m7.768s\x0d\x0aur 2m4.405s\x0d\x0asys 0m0.038s\x0d\x0achinsung@gentoo ~/workspace/test/Debug $ time ./test \x0d\x0a0: 10.00%\x0d\x0a1: 10.00%\x0d\x0a2: 10.00%\x0d\x0a3: 10.00%\x0d\x0a4: 10.00%\x0d\x0a5: 10.00%\x0d\x0a6: 10.00%\x0d\x0a7: 10.00%\x0d\x0a8: 10.00%\x0d\x0a9: 10.00%\x0d\x0a\x0d\x0areal 2m7.269s\x0d\x0aur 2m4.077s\x0d\x0asys 0m0.025s\x0d\x0a\x0d\x0a前一次為進行inline優化的情形,后一次為沒有作inline優化的情形,兩次結果相差不大,甚至各項指標后者還要好一些,不知是何緣由...
電腦如何產生隨機數?
電腦產生的隨機數稱為偽隨機數,是通過算法模擬的,看上去和隨機數一樣,實際上能算出來的數就是可以預見的數(對用戶來說不可預見,對電腦則是可預見),不是真正的隨機數。
從一個大數“種子”開始重復某種迭代計算,通常是加減乘除加求余,種子可以取系統時間,因為用戶不可能精確到微秒控制程序運行,就基本保證了每次生成數值的順序不同
一般來說如果用數字電路產生的都是偽隨機數,但由于循環時間太長可視為隨機數。而現在有用模擬電路產生的隨機數,主要原理是將熱噪聲放大,然后編碼。
擴展資料
隨機數的作用
隨機數的使用歷史已經有數千年。無論是拋硬幣還是搖色子,目的是讓隨機概率決定結果。電腦中的隨機數生成器的目的也是如此——生成隨機不可預測的結果。
加密法要求數字不能被攻擊者猜到,不能多次使用同樣的數字。所以需要一種機制產生攻擊者無法預測的數字,這些隨機數對加密法至關重要,無論你是加密文件還是訪問https協議網站,都需要用到隨機數。
根據隨機數的生成原理,我們把電腦隨機數分為兩類:“真”隨機數和偽隨機數。
要生成一個“真”隨機數,電腦會檢測電腦外部發生的某種物理現象。比如說,電腦可以測量某個原子的放射性衰變。根據量子理論,原子衰變是隨機而不可測的,所以這就是宇宙中的“純粹”隨機性。攻擊者永遠無法預測原子衰變的發生時間,也就不可能猜出隨機值。
參考資料來源:
百度百科——隨機數
如何產生真正的隨機數
產生隨機數有多種不同的方法。這些方法被稱為隨機數發生器。隨機數最重要的特性是它在產生是后面的那個數與前面的那個數毫無關系。真正的隨機數是使用物理現象產生的:比如擲錢幣、骰子、轉輪、使用電子元件的噪音、核裂變等等。這樣的隨機數發生器叫做物理性隨機數發生器,它們的缺點是技術要求比較高。在實際應用中往往使用偽隨機數就足夠了。這些數列是“似乎”隨機的數,實際上它們是通過一個固定的、可以重復的計算方法產生的。它們不真正地隨機,因為它們實際上是可以計算出來的,但是它們具有類似于隨機數的統計特征。這樣的發生器叫做偽隨機數發生器。在真正關鍵性的應用中,比如在密碼學中,人們一般使用真正的隨機數。
excel中如何產生隨機數
1、首先介紹一下如何用RAND()函數來生成隨機數(同時返回多個值時是不重復的)。
如下圖所示,在單元格中輸入=RAND(),回車后單元格即返回了一個隨機數字。
2、RAND()函數返回的隨機數字的范圍是大于0小于1。因此,也可以用它做基礎來生成給定范圍內的隨機數字。
3、生成制定范圍的隨機數方法是這樣的,假設給定數字范圍最小是A,最大是B,公式是:
=A+RAND()*(B-A)。
舉例來說,要生成大于60小于100的隨機數字,因為(100-60)*RAND()返回結果是0到40之間,加上范圍的下限60就返回了60到100之間的數字。
4、上面RAND()函數返回的0到1之間的隨機小數,如果要生成隨機整數的話就需要用RANDBETWEEN()函數了,如下圖該函數生成大于等于1小于等于100的隨機整數。
這個函數的語法是這樣的:=RANDBETWEEN(范圍下限整數,范圍上限整數),結果返回包含上下限在內的整數。注意:上限和下限也可以不是整數,并且可以是負數。
5、RAND()和RANDBETWEEN()是生成隨機數的基礎函數,也可以靈活變通。比如說要生成0.01至1之間包含兩位小數的隨機數,則可用下圖的公式實現:
在WORD里,怎么產生隨機數?
以word2016版本為例,產生隨機數的方法步驟如下:
步驟一、打開需要插入隨機數的word文件。
步驟二、選擇工具欄中的“插入”標簽,然后點擊“對象”按鈕。
步驟三、在對象類型中選擇“Microsoft Excel Binary Worksheet”,然后點擊確定。
步驟四、在插入的Excel對象框的A1單元格中輸入“=ROUND(RAND()*10+40,0)&","&ROUND(RAND()*10+40,0)”。
步驟五、然后拖動虛線框使其只顯示一個單元格。
步驟六、隨機數生成完畢,效果如圖。