種子演算法
A. 隨機種子的方法
一般種子可以以當前的系統時間,這是完全隨機的
演算法1:平方取中法。
1)將種子設為X0,並mod 10000得到4位數
2)將它平方得到一個8位數(不足8位時前面補0)
3)取中間的4位數可得到下一個4位隨機數X1
4)重復1-3步,即可產生多個隨機數
這個演算法的一個主要缺點是最終它會退化成0,不能繼續產生隨機數。
演算法2:線性同餘法
1)將種子設為X0,
2)用一個演算法X(n+1)=(a*X(n)+b) mod c產生X(n+1)
一般將c取得很大,可產生0到c-1之間的偽隨機數
該演算法的一個缺點是會出現循環。
在windows平台下,可以考慮將如下參數作為影響種子的因素。
⒈GetTickCount()
系統啟動以來的嘀嗒時間
說明:該時間與系統運行時長相關,
⒉GetCurrentProcessId()
當前進程Id號
說明:該Id與系統啟動進程數量及次序有關,一般波動范圍較小。
⒊GetCurrentProcess()
當前進程句柄
說明:該句柄實質就是內存地址,但每次進程啟動時地址值是不確定的。
⒋GetProcessTimes()
進程時間參數
說明:-
⒌GetCurrentThreadId()
當前線程Id號
⒍GetCurrentThread()
當前線程句柄
⒎GetThreadTimes()
線程時間參數
⒏GetCurrentHwProfile()
Profile配置文件
⒐GetSysColor()
系統Color
⒑GetSystemInfo()
系統信息
⒒GetSystemPowerStatus()
電源狀態
⒓GetKeyboardState()
鍵盤狀態
⒔GlobalMemoryStatus()
內存狀態
⒕time()
當前時間 秒
⒖GUID
各硬體設備GUID
⒗MAC
網卡mac
⒘CPUID
CPU Id號
⒙音效卡錄音噪音
該參量與環境相關
⒚用戶鍵盤間隔時間
該參量與用戶習慣相關
其次,盡最大可能增加這些因素的維度。這里說的維度是指
種子結果與因素之間的關聯程度。一般使用hash函數對多個
因素進行哈希運算。這樣得到的種子具有較強的散列特性。
通過以上技術手段得到的種子產生的偽隨機數是具有較好
統計特性的,它不依賴於某一台機器,某一時刻,某一方法,
而是復雜多變、讓人捉摸不透難於重現的。
B. 種子填充演算法的時間復雜度和空間復雜度分析
從塗色的角度講,區域內的n個點,每一個點只被塗了一次色,沒有重復塗,所以可以認為時間復雜度是O(n);空間復雜度也為O(n),雖然有些點重復棧
C. 隨機種子
偽隨機數是以一個稱為「種子」的數作為初始條件,通過固定的演算法產生一個看上去像是隨機產生的數字序列的。
舉例來說,這個演算法可以設計成類似於「將給定的種子開平方,取有效數字的第2至9位作為下一次迭代的種子,重復此過程3次後,以結果的第1-4位作為返回值、並將該結果作為下次調用本過程的種子」等等。
然而,無論這個演算法如何復雜,只要它固定不變,則對於相同的種子來說,每一次從這個種子開始、第n次通過該演算法取得的偽隨機數卻總是一樣的,因此必須再通過各種真正客觀的途徑使得該初始的種子不同。一般來說常用的方式是以運行時候的時鍾時間,經一定變化後作為初始的種子的。
D. 用隊列實現種子填充演算法的非遞歸
一、種子填充演算法(Seed Filling)
如果要填充的區域是以圖像元數據方式給出的,通常使用種子填充演算法(Seed Filling)進行區域填充。種子填充演算法需要給出圖像數據的區域,以及區域內的一個點,這種演算法比較適合人機交互方式進行的圖像填充操作,不適合計算機自動處理和判斷填色。根據對圖像區域邊界定義方式以及對點的顏色修改方式,種子填充又可細分為幾類,比如注入填充演算法(Flood Fill Algorithm)、邊界填充演算法(Boundary Fill Algorithm)以及為減少遞歸和壓棧次數而改進的掃描線種子填充演算法等等。
所有種子填充演算法的核心其實就是一個遞歸演算法,都是從指定的種子點開始,向各個方向上搜索,逐個像素進行處理,直到遇到邊界,各種種子填充演算法只是在處理顏色和邊界的方式上有所不同。在開始介紹種子填充演算法之前,首先也介紹兩個概念,就是「4-聯通演算法」和「8-聯通演算法」。既然是搜索就涉及到搜索的方向問題,從區域內任意一點出發,如果只是通過上、下、左、右四個方向搜索到達區域內的任意像素,則用這種方法填充的區域就稱為四連通域,這種填充方法就稱為「4-聯通演算法」。如果從區域內任意一點出發,通過上、下、左、右、左上、左下、右上和右下全部八個方向到達區域內的任意像素,則這種方法填充的區域就稱為八連通域,這種填充方法就稱為「8-聯通演算法」。如圖1(a)所示,假設中心的藍色點是當前處理的點,如果是「4-聯通演算法」,則只搜索處理周圍藍色標識的四個點,如果是「8-聯通演算法」則除了處理上、下、左、右四個藍色標識的點,還搜索處理四個紅色標識的點。兩種搜索演算法的填充效果分別如如圖1(b)和圖1(c)所示,假如都是從黃色點開始填充,則「4-聯通演算法」如圖1(b)所示只搜索填充左下角的區域,而「8-聯通演算法」則如圖1(c)所示,將左下角和右上角的區域都填充了。
圖(1) 「4-聯通」和「8-聯通」填充效果
並不能僅僅因為圖1的填充效果就認為「8-聯通演算法」一定比「4-聯通演算法」好,應該根據應用環境和實際的需求選擇聯通搜索方式,在很多情況下,只有「4-聯通演算法」才能得到正確的結果。
1.1 注入填充演算法(Flood Fill Algorithm)
注入填充演算法不特別強調區域的邊界,它只是從指定位置開始,將所有聯通區域內某種指定顏色的點都替換成另一種顏色,從而實現填充效果。注入填充演算法能夠實現顏色替換之類的功能,這在圖像處理軟體中都得到了廣泛的應用。注入填充演算法的實現非常簡單,核心就是遞歸和搜索,以下就是注入填充演算法的一個實現:
164 void FloodSeedFill(int x, int y, int old_color, int new_color)
165 {
166 if(GetPixelColor(x, y) == old_color)
167 {
168 SetPixelColor(x, y, new_color);
169 for(int i = 0; i < COUNT_OF(direction_8); i++)
170 {
171 FloodSeedFill(x + direction_8[i].x_offset,
172 y + direction_8[i].y_offset, old_color, new_color);
173 }
174 }
175 }
for循環實現了向8個聯通方向的遞歸搜索,秘密就在direction_8的定義:
15 typedef struct tagDIRECTION
16 {
17 int x_offset;
18 int y_offset;
19 }DIRECTION;
79 DIRECTION direction_8[] = { {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1},{0, -1}, {-1, -1} };
這個是搜索類演算法中常用的技巧,無需做太多說明,其實只要將其替換成如下direction_4的定義,就可以將演算法改成4個聯通方向填充演算法:
80 DIRECTION direction_4[] = { {-1, 0}, {0, 1}, {1, 0}, {0, -1} };
圖2就是應用本演算法實現的「4-聯通」和「8-聯通」填充效果:
E. 社交網路種子節點搜索演算法有幾種基本的
針對經典影響力最大化演算法存在的計算時間過長等問題,提出一種新的啟發式貪婪演算法-高節點度貪婪演算法(HD_Greedy)。基於社交網路節點的度呈冪律分布以及節點的度與影響力強關聯性,在極小部分高度數節點中搜索最大影響力種子節點,使搜索空間大幅度地減少,節約了大量的盲目搜索時間,並且不損失種子節點影響力。實驗結果表明,在不同信息傳播模型中,HD_Greedy演算法得到的種子節點影響力與其它貪婪演算法接近,但計算效率有了較大提高,尤其適合於在大規模社交網路中搜索最大影響力種子節點。
F. 利用種子法,圖像處理如何確定基準點矩陣
matlab 圖像定位方法如下:
1由RGB空間轉化到HSV空間,統計紅色點;
2若紅色點置1,背景色置0,閉運算連通可能區域;
3種子法獲取區域個數及坐標,此時可能截取到多個擁有紅色像素的區域,比如郵政編碼及下面的信函位置;
4截取兩個可能的區域,分別進行閾值分割二值化,根據水平方向上的跳變數或者寬高比就可以篩選出編碼區域,同時可以垂直投影二值化圖像,根據6個方塊位置得到其中字元位置;
5使用BP神經網路訓練/模板匹配等方法識別字元。
MATLAB和Mathematica、Maple並稱為三大數學軟體。它在數學類科技應用軟體中在數值計算方面首屈一指。MATLAB可以進行矩陣運算、繪制函數和數據、實現演算法、創建用戶界面、連接其他編程語言的程序等,主要應用於工程計算、控制設計、信號處理與通訊、圖像處理、信號檢測、金融建模設計與分析等領域。
G. 掃描線填充演算法與種子填充演算法的區別是什麼
種子優點是非常簡單,缺點是需要大量棧空間來存儲相鄰的點。
改進的方法就是:通過沿掃描線填充水平像素段,來處理四連通或八連通相鄰點,這樣就僅僅只需要將每個水平像素段的起始位置壓入棧,而不需要將當前位置周圍尚未處理的相鄰像素都壓入棧,從而可以節省大量的棧空間。
H. 什麼是隨機數及隨機數種子,能不能詳細通俗介紹一下
隨機數就是就隨機數種子中取出的數。種子就是個序號,這個序號交給一個數列管理器,通過這個序號,你從管理器中取出一個數列,這個數列就是你通過那個序號得到的隨機數。
但這個隨技術並不真正隨機。因為它是通過某個演算法的得到。也就是說你給數列管理器同一個序號將得到同樣一個「隨機」數列。
也就是說種子和隨機數列是一一對應的。{An}=f(x), x 就是種子,F()是演算法,{An}是數列,這個數列看上去是隨機的,這是因為An的通項很復雜。
例如:
從1、2、3、4、5、6、7、8、9、0這十個數中隨機取出一個數,取出的數是6的話,那麼6就叫隨機數。十個數字就叫隨機數種子。
如果是從1到50之間取數字,取出的數字叫隨機數,這1到50那50個數字就叫隨機數種子。
(8)種子演算法擴展閱讀:
根據密碼學原理,隨機數的隨機性檢驗可以分為三個標准:
統計學偽隨機性。統計學偽隨機性指的是在給定的隨機比特流樣本中,1的數量大致等於0的數量,同理,「10」「01」「00」「11」四者數量大致相等。類似的標准被稱為統計學隨機性。滿足這類要求的數字在人類「一眼看上去」是隨機的。
密碼學安全偽隨機性。其定義為,給定隨機樣本的一部分和隨機演算法,不能有效的演算出隨機樣本的剩餘部分。
真隨機性。其定義為隨機樣本不可重現。實際上只要給定邊界條件,真隨機數並不存在,可是如果產生一個真隨機數樣本的邊界條件十分復雜且難以捕捉(比如計算機當地的本底輻射波動值),可以認為用這個方法演算出來了真隨機數。
相應的,隨機數也分為三類:
偽隨機數:滿足第一個條件的隨機數。
密碼學安全的偽隨機數:同時滿足前兩個條件的隨機數。可以通過密碼學安全偽隨機數生成器計算得出。
真隨機數:同時滿足三個條件的隨機數。