軟體生成真隨機數組的一種方案

2021-05-01 21:27:09 字數 1227 閱讀 5124

各種檔案都以位元組為單位,所以我們研究以位元組為單位的隨機數組即可,位元組的取值 0 - 255,它們是隨機數組的元素,建造乙個256個元素沒有重複元素的小陣列,稱之為單元陣列,這樣的單元有256!個大約有8.7×10的502次方之多。我們通過變換陣列成員的位置獲得新的單元,將生成的各單元連線起來組成大陣列。

一、隨機交換單元陣列的成員位置:

(1)借助於隨機函式可以完成這種交換,方法是這樣,用c語言描述

unsigned int n1;  //記錄陣列的序號

unsigned char ch;  //臨時記錄陣列成員的數值 

unsigned char dy[256] =  //初始單元陣列;

for(int i=0;i<256;i++) //完成一次單元陣列的排序

如上可見,隨機函式rand()產生的數值取模256後的值作為序號n1,將dy[n1]和dy[i]的數值交換,經過迴圈後單元陣列的內容全變了,新的單元陣列生成了。

(2)通過單元陣列自身完成交換

for(int i=0;i<256;i++)

因為單元陣列本身就是隨機數,當然可以利用來生成新的陣列,當然也可以用前一組單元來排序。根據小陣列試驗得知,無限的做下去是不行的,可能產生迴圈。但256個元素的單元做2的32次方個也就是4.29g個迴圈,沒有發現重複單元的產生。為了避免重複,不讓它進行太多的迴圈。

二、生成隨機數組

我們知道可以從計算機的時間得到乙個不大的真隨機數,為什麼這樣說,因為數值的前面總是一樣的,而只能利用變化的部分。得到來自時間的真隨機數後,經計算讓它作為我們用到的隨機函式的種子。然後利用隨機函式加工初始單元陣列見一、(1),完成後用一、(2)的方式進行10000次迴圈,生成10000個單元,將單元連線起來組成結果陣列,現在陣列長度有2.56m位元組了,然後再取乙個來自時間的真隨機數(當然也可以取前面陣列的某些數值組成種子)作為隨機函式種子然後作用於陣列,再生成下乙個10000個單元...直到夠用為止,可見隨機函式的利用率是很低的,用256個位元組的隨機函式數值生成2.65m個位元組的陣列。這裡10000是任意的大些小些都無所謂。由於隨機函式起點是隨機選取的,隨機函式的週期影響不到此種方法,如果畫蛇添足的話可選用大週期隨機函式。

三、陣列形成原理

這種方法生成隨機數組本質上是利用了熱力學第二定律也就是熵增加原理,對陣列序列的隨機排序只能使其越來越混亂,而不能越攪合越有規律。

這樣形成的隨機數組比來自物理現象的數值要更好一些,來自物理現象的數值往往有一些缺陷,例如連續數值相同,小規模的相似等,需要修正才能用,而這個不會有那些問題。

生成真正的隨機數!

這裡涉及到偽隨機數的概念,什麼是偽隨機數呢?偽隨機數是使用一些稱為種子 seed 的初始值通過某種演算法得到的。這個演算法是確定的,因此產生的數字序列在統計上並非隨機的。只是,假如這個演算法優良,那麼結果得到的數字序列就行通過很多合理的隨機性測試。這些數字通常被稱為偽隨機數 psreudorando...

一種隨機數生成演算法

隨機數生成類 class randnumber randnumber randnumber unsigned long s 0 else unsigned short randnumber random unsigned long n double randnumber frandom unsign...

一種快速可預製的隨機數組產生方法

在工程軟體的設計和安全系統設計中,建立模型 產生密碼經常需要使用到隨機數組。然而計算機不會產生絕對隨機的隨機數,計算機只能產生 偽隨機數 其實絕對隨機的隨機數只是一種理想的隨機數,即使計算機怎樣發展,它也不會產生一串絕對隨機的隨機數。計算機只能生成相對的隨機數,即偽隨機數。偽隨機數並不是假隨機數,而...