當我們需要使用亂數時,是不是都用以下方式呢?
int main(){
int Ra;
Ra=(rand()%100)+1;
printf("Random : %d \n", Ra);
return 0;
}
或是先宣告#include <time.h>
再使用以下程式呢?
int main(){
int Ra;
srand(time(NULL));
Ra=(rand()%100)+1;
printf("Random : %d \n", Ra);
return 0;
}
===================分格線===================
可能大家都有很多方法去產生亂數
但大家有沒有想過你們所產生的亂數是真正的亂數嗎?
以上述程式碼為例,是利用時間才產生亂數,所以才需要宣告#include <time.h>
在需要夠亂的程式,可能會加入更多的因素,而影響輸出的數字。
例如:賭埸的百家樂(電子版),除了用時間作因子外,也可能加入觸碰螢幕的位置、人為的設定...等等
所以大家玩遊戲時,有聽某某人說:每分鐘的00秒時抽卡片,卡片會比較好。
或是:當有人抽到好卡片時,你也要馬上跟著抽,好運會滾滾來。
這證明它們的亂數,也並非真正的亂數。
可能你現在還是很疑惑,不就是亂數嗎?
我再舉一個例子:
在田莊中放一顆蘋果的種子,10年後,這個田莊可能會有很多顆樹,但這些樹都是蘋果樹
我們目前想要的是:在田莊中放一顆種子,10年後,田莊要長很多顆不同種類的樹
可能你會想,那你一開始就放多幾顆不同品種的種子。
這樣的做法,就好像在亂數中,參入更多的影響因子
這樣看似可行,但只要有人掌握了這些影響因子,這樣亂數就變成可預測的亂數了。
===================分格線===================
就為了亂數,需要搞那麼多東西嗎?
的確是需要的。
亂數可以幫助密碼學,來產生安全度更高、
對於賭場也幫助了不少
而且,也有不少人以「亂數」作為論文
論文名稱:真實亂數產生器之設計
網站:https://ndltd.ncl.edu.tw/cgi-bin/gs32/gsweb.cgi?o=dnclcdr&s=id=%22089NCTU0428044%22.&searchmode=basic
===================分格線===================
如果沒有「亂數」,或是「亂數」出錯,會怎樣?
其實在 2015 年,美國樂透彩爆出重大醜聞,該協會的安全主管 Eddie Tipton 傳出可以預測樂透獎開票結果,一年內可以有 3 天預測樂透數字,因此 Eddie Tipton 以及他的親友從 2005 年到 2011 年之間,在美國多州獲得金額不等的獎金,賺得了高額的意外之財。
新聞來源自:https://technews.tw/2017/06/23/us-lottery-security-director-cheat-500-million-could-face-25-years-in-prison/
(這時候,各位工程師是不是也在算台灣的樂透彩,看看是不是也會有3天的機會可以預測數字?
不要想太多了,這新聞的後部份是:彩票的亂數產生器遭人植入非官方程式碼,所以才可以得到樂透的結果。
大家不要知法犯法。
除了美國外,俄羅斯也有相關的新聞
https://www.cnread.news/content/6837113.html
利用逆向工程,分析老虎機所使用的演算法,推算何時按下按鈕來提高中獎的機會
(這是比較合法的方式去贏錢
===================分格線===================
論文題目除了為了學術研究外,更可以考慮如何運用在實際生活中。
這個時候大家是不是對「亂數」產生了不少的興趣?
今天是我30天鐵人賽的最後一天
先謝謝大家的支持