本發(fā)明屬于計算機算法領域,具體地說涉及一種計算機、特別是單片機適用的偽隨機數(shù)種子生成方法。
背景技術:
隨機數(shù)在信息通訊、數(shù)據(jù)加密、計算機數(shù)據(jù)處理等領域應用廣泛,特別是在無線通信防碰撞設計、數(shù)據(jù)加密通訊和認證等技術領域,隨機數(shù)是關鍵基礎和安全的保障。
在計算機或單片微機中使用的隨機數(shù)并非嚴格意義上的“隨機數(shù)”,而是按照一定的數(shù)學方法產(chǎn)生的數(shù)列,但只要這種數(shù)列符合均勻性、抽樣隨機性等統(tǒng)計要求,便被當作隨機數(shù)來使用,并稱為偽隨機數(shù)。
計算機偽隨機數(shù)的生成需要一個高隨機性的種子(初值),通過一定的算法,生成偽隨機數(shù)列,從中選取偽隨機數(shù)使用。種子的取得多種多樣,大多通過采樣各類傳感器數(shù)據(jù)、讀取存儲器或寄存器數(shù)據(jù)、讀取時間或開機時長數(shù)據(jù)、人工輸入數(shù)據(jù)、預先保存的數(shù)據(jù)等方式獲取。
不同的計算機或處理器系統(tǒng)的硬件資源不同,而且數(shù)據(jù)處理系統(tǒng)需要的隨機數(shù)的范圍也各不相同。通過上述方式取得的種子往往不適合直接使用,需要縮減或者擴展長度,特別是單片機運算資源有限,需要對種子先期處理,提高種子的隨機性和適用性。通常對種子僅做簡單的截取或拼接后使用,或者不做處理直接使用。這樣當隨機數(shù)列僅生成一次,而多次使用隨機數(shù)僅從該數(shù)列中依次選取時,對隨機數(shù)的隨機性影響不大;但如果資源有限,使用隨機數(shù)時都重新生成數(shù)列或使用過程中存在多次生成隨機數(shù)列時,偽隨機數(shù)的隨機性就大大降低了。
技術實現(xiàn)要素:
本發(fā)明的目的是提供一種偽隨機數(shù)種子的生成方法。本發(fā)明主要分為三個步驟,根據(jù)數(shù)據(jù)初值的大小,分兩種情況,采用兩種不同的處理方法生成偽隨機數(shù)種子。
本發(fā)明的生成方法按如下步驟實現(xiàn):
(1)第一步:通過AD轉換器采樣傳感器(如溫度傳感器)數(shù)據(jù),或讀取系統(tǒng)時間或開機時長數(shù)據(jù),得到數(shù)據(jù)的初值,但初值位數(shù)長度不滿足隨機數(shù)長度要求。
(2)第二步:
1)當數(shù)據(jù)初值長度大于隨機數(shù)的長度或數(shù)據(jù)初值大于最大可取隨機數(shù)時,采用按權分段法將數(shù)據(jù)初值分成若干個子數(shù)據(jù)。
2)當數(shù)據(jù)初值長度小于隨機數(shù)的長度時,采用鏡像法得到數(shù)據(jù)初值的鏡像數(shù)據(jù)。
(3)第三步:
1)當數(shù)據(jù)初值長度大于隨機數(shù)的長度或數(shù)據(jù)初值大于最大可取隨機數(shù)時,將得到的若干個子數(shù)據(jù)進行非進位加運算得到偽隨機數(shù)種子;或者將得到的若干個子數(shù)據(jù)進行累加得到數(shù)據(jù)中間值,若該中間值符合隨機數(shù)長度要求,即得到偽隨機數(shù)種子。若該中間值依然比偽隨機數(shù)種子長度大,重復第二步和本步,直到得到符合要求的偽隨機數(shù)種子,或采用截斷處理直接得到偽隨機數(shù)種子。
2)當數(shù)據(jù)初值長度小于隨機數(shù)的長度時,將得到的初值鏡像數(shù)據(jù)乘以W的N次方。其中W為采用的數(shù)制進制,N為自然數(shù),N等于數(shù)據(jù)初值長度?;蛘弋旊S機數(shù)長度大于等于2倍數(shù)據(jù)初值長度時,N等于數(shù)據(jù)初值長度,反之N等于隨機數(shù)長度與數(shù)據(jù)初值長度之差。使初值鏡像放大到2倍數(shù)據(jù)初值長度,或者放大到剛好等于偽隨機數(shù)的長度(偽隨機數(shù)長度小于2倍數(shù)據(jù)初值長度時)。使用0替換掉所得數(shù)據(jù)的低端長度等于數(shù)據(jù)初值的部分,再與數(shù)據(jù)初值進行加運算或者非進位加運算?;蛘邔?shù)據(jù)初值與初值鏡像對調(diào)進行上述運算處理,得到數(shù)據(jù)中間值。若該中間值大于偽隨機數(shù)種子長度,采用截斷處理得到偽隨機數(shù)種子;若該中間值依然比偽隨機數(shù)種子長度小,重復第二步和本步,直到得到符合要求的偽隨機數(shù)種子。
所述的按權分段法是指選取某個數(shù)做為權基數(shù)——該權基數(shù)應在最大可取偽隨機數(shù)(或比最大可取偽隨機數(shù)長度大1的最小數(shù))到最高權重僅次于最大偽隨機數(shù)最高權重的最大數(shù)之間,宜取最大可取偽隨機數(shù)(或比最大可取偽隨機數(shù)長度大1的最小數(shù))——以該權基數(shù)的0、1、2……n次方(n為自然數(shù))為權重,將對象數(shù)據(jù)分成若干個數(shù)據(jù)之和,再除以對應權重后得到若干個子數(shù)據(jù)段的方法。
所述的鏡像法是指按數(shù)據(jù)的數(shù)制,將數(shù)據(jù)的低端位上的數(shù)字與數(shù)據(jù)高端位上的數(shù)字依次對調(diào),即第0位與最高位、第1位次高位,依次類推地對調(diào),得到新數(shù)據(jù)的方法。
所述的截斷處理是指從數(shù)據(jù)的低端或者高端,去掉一定長度的數(shù)據(jù)位,保留另一端數(shù)據(jù)位為新數(shù)據(jù)的處理方法。
所述的非進位加運算是指數(shù)據(jù)進行加法運算,當任何數(shù)據(jù)位相加有進位產(chǎn)生時,都舍掉進位,僅保留非進位部分的運算方法,當采用二進制時即為異或。
作為優(yōu)選,所述的按權分段法選用10的自然冪指數(shù)或者16的自然冪指數(shù)為權基數(shù)。
作為優(yōu)選,所述的截斷處理從數(shù)據(jù)的高端截掉,保留低端數(shù)據(jù)。
具體實施方式
實施例1
采用10進制數(shù),生成0到10000的隨機整數(shù)(0到10000的隨機數(shù)主要集中在4位數(shù)區(qū)域,因此可認為隨機數(shù)長度為4)。
1)第一步:從9位AD中采樣溫度傳感器數(shù)據(jù),得到數(shù)據(jù)初值為185;
2)第二步:數(shù)據(jù)初值185偏小,長度為3,應使用鏡像法進行擴展。將個位數(shù)5與百位數(shù)1對調(diào),十位數(shù)8居正中無須對調(diào),得到初值鏡像581;
3)第三步:①隨機數(shù)主要集中在4位數(shù)長度,數(shù)據(jù)初值長度為3,其長度差為1,因此可以將初值鏡像581乘以10的1次方,得到5810,使用“0”替換低3位得到5000(或1000),與初值(或初值鏡像)相加,得到偽隨機數(shù)種子5185(或1581);②或者數(shù)據(jù)初值長度為3,直接將初值鏡像581乘以10的3次方,得到581000,與數(shù)據(jù)初值相加,得到581185,截斷高2位數(shù)據(jù),得到偽隨機數(shù)種子1185,或者截斷低2位數(shù)據(jù),得到偽隨機數(shù)種子5811;③或者隨機數(shù)主要集中在4位數(shù)長度,數(shù)據(jù)初值長度為3,其長度差為1,將數(shù)據(jù)初值185乘以10的1次方, 得到1850,使用“0”替換低3位得到1000,與初值鏡像相加,得到偽隨機數(shù)種子1581;④數(shù)據(jù)初值長度為3,直接將數(shù)據(jù)初值185乘以10的3次方,得到185000,與初值鏡像相加,得到185581,截斷高2位數(shù)據(jù),得到偽隨機數(shù)種子5581,或者截斷低2位數(shù)據(jù),得到偽隨機數(shù)種子1185。
實施例2
采用2進制數(shù),生成0到10000(二進制為10011100010000)的隨機數(shù)(隨機數(shù)種子宜為13位)。
1)第一步:從9位AD中采樣溫度傳感器數(shù)據(jù),得到數(shù)據(jù)初值為185(0b010111001);
2)第二步:數(shù)據(jù)初值0b010111001為9位,小于偽隨機數(shù)種子的適宜長度13位,將數(shù)據(jù)初值0b010111001做鏡像對調(diào),即第0位與第8位對調(diào),第1位與第7位對調(diào)……第4位自身對調(diào)仍為第4位,得到初值鏡像0b100111010;
3)第三步:①偽隨機數(shù)種子長度與數(shù)據(jù)初值長度之差為4,將初值鏡像0b100111010乘以2的4次方(左移4位),得到0b1001110100000,使用“0”替換低9位(與0x1E00求與)得到0b1001100000000,與數(shù)據(jù)初值0b010111001相加,得到偽隨機數(shù)種子0b1001110111001(5049);②或者數(shù)據(jù)初值長度為9位,直接將初值鏡像乘以2的9次方,得到0b100111010000000000,與數(shù)據(jù)初值相加,得到0b100111010010111001,截斷高5位數(shù)據(jù),得到偽隨機數(shù)種子0b1010010111001(5305),或者截斷低5位數(shù)據(jù),得到偽隨機數(shù)種子0b1001110100101(5029);③或者偽隨機數(shù)長度為13位,數(shù)據(jù)初值長度為9,其長度差為4,將數(shù)據(jù)初值0b010111001乘以2的4次方, 得到0b0101110010000,使用“0”替換低9位得到0b0101000000000,與初值鏡像相加,得到偽隨機數(shù)種子0b0101100111010(2874);④數(shù)據(jù)初值長度為9,直接將數(shù)據(jù)初值0b010111001乘以2的9次方,得到0b010111001000000000,與初值鏡像0b100111010相加,得到0b010111001100111010,截斷高5位數(shù)據(jù),得到偽隨機數(shù)種子0b1001100111010(4922),或者截斷低2位數(shù)據(jù),得到偽隨機數(shù)種子0b0101110011001(2969)。
實施例3
采用10進制數(shù),生成0到100的隨機整數(shù)(隨機數(shù)種子宜為2位)。
1)第一步:從9位AD中采樣溫度傳感器數(shù)據(jù),得到數(shù)據(jù)初值為185;
2)第二步:數(shù)據(jù)初值185為3位,比隨機數(shù)種子長度大1位,且比可取偽隨機數(shù)大。使用按權分段法,取最大可取偽隨機數(shù)100為權基數(shù),使用1000和1001為權重將數(shù)據(jù)185拆分為100加85,分別除以對應權重得到子數(shù)據(jù)1和85;
3)第三步:數(shù)據(jù)初值長度大于隨機數(shù)種子長度,使用按權分段處理。將子數(shù)據(jù)1和85相加(或非進位加),得到偽隨機數(shù)種子86。
實施例4
采用2進制數(shù),生成0到100(二進制為0b1100100)的隨機數(shù)(隨機數(shù)種子宜為7位)。
1)第一步:從9位AD中采樣溫度傳感器數(shù)據(jù),得到數(shù)據(jù)初值為0b010111001;
2)第二步:數(shù)據(jù)初值0b010111001的有效數(shù)據(jù)為0b10111001,長度為8,比隨機數(shù)種子長度長,且比最大可取偽隨機數(shù)大。使用按權分段法,取長度比隨機數(shù)種子大1的最小數(shù)27(0b10000000 ,即128)為權基數(shù),使用20和27為權重將數(shù)據(jù)初值0b010111001拆分為0b10000000加0b111001,分別除以對應權重得到子數(shù)據(jù)0b1和0b111001;
第三步:數(shù)據(jù)初值長度大于隨機數(shù)種子長度,使用按權分段處理。將子數(shù)據(jù)0b1和0b111001相加,得到偽隨機數(shù)種子0b111010(58);或將子數(shù)據(jù)0b1和0b111001異或,得到偽隨機數(shù)種子0b111000(56)。