?? 隨機數的產生原理與實現 老羅的繽紛天地.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0062)http://www.luocong.com/articles/show_article.asp?Article_ID=24 -->
<HTML><HEAD><TITLE>隨機數的產生原理與實現 | 老羅的繽紛天地</TITLE>
<META content="MSHTML 6.00.2800.1400" name=GENERATOR>
<META http-equiv=Content-Type content="text/html; charset=gb2312"><LINK rev=made
href="mailto:admin@luocong.com"><LINK href="index.htm" rel=home><LINK
href="WikiIndex.htm" rel=index><LINK href="隨機數的產生原理與實現 老羅的繽紛天地_files/main.css"
type=text/css rel=stylesheet></HEAD>
<BODY>
<H1>隨機數的產生原理與實現</H1><!-- Page published by Emacs Wiki begins here -->
<P class=article_content>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD><A
href="http://www.luocong.com/articles/zipped/Random.zip">下載本節例子程序和源代碼</A>
(3.91
KB)</TD></TR></TBODY></TABLE><BR>隨機數的產生在病毒中占有十分重要的地位,尤其是在變形引擎中,沒有它就不成事了……因此,今天就讓我們來探討一下如何產生一個隨機數。<BR><BR>首先值得說明的是,要產生一個隨機數,方法有很多種,例如混沌和分形理論(原理比較復雜,但是公式卻異常簡單,將來有空的話我會介紹一下)……但是這些方法的缺點是計算難度大,需要花費的時間多,有沒有一種實現起來比較簡單的方法呢?<BR><BR>答案是肯定的。我們先來看一條數學公式:<BR><BR>
<TABLE cellSpacing=0 cellPadding=0 bgColor=#fbedbb border=0>
<TBODY>
<TR>
<TD>Rand_Number = (Rand_Seed * X + Y) mod
Z</TD></TR></TBODY></TABLE><BR>利用這條公式,我們就可以生成一個偽隨機數了。可是為什么是“偽隨機數”呢?因為實際上要保證每次生成的隨機數都不同,那是不太可能的,我們唯一能做到的只能是盡量使每次生成的數字與前面的不同,并且盡量使生成的數字均勻分布在指定的范圍內。<BR><BR>上面的這條公式就能滿足這兩點。至于為什么……呵呵,我也不懂,因為它牽涉到十分復雜的數學求證過程,我們只需要知道如何應用就成了:<BR><BR>Rand_Seed
表示隨機數種子,注意這個“種子”必須每次都不同,我們可以簡單地利用 GetTickCount() 這個 API
來獲得不同的數字,當然,你也可以用別的方法來取得,例如讀取當前鼠標的坐標等等……<BR><BR>X、Y必須至少有一個為素數。什么叫素數?Hoho,讓我們來翻翻小學課本……素數就是除了
1 和它本身,不能被其他數整除的數字。在這里我們可以簡單地給 X、Y 賦值 23 和 7 ,其實別的素數也行,我只是隨便取了這兩個數字。<BR><BR>最后,Z
也應該是一個素數,這樣才能保證產生的隨機數能得到上限的值。不過我在實踐中發現,這個 Z 不一定要準確地為素數。Why? I also don’t
know...<BR><BR>總結一下,利用以上的公式,我們可以編寫匯編代碼如下:<BR><BR>
<TABLE cellSpacing=0 cellPadding=0 bgColor=#fbedbb border=0>
<TBODY>
<TR>
<TD><A name=L98>iRand <FONT color=#ff0000>proc</FONT> <FONT
color=#ff0000>uses</FONT> <FONT color=#ff0000>ecx</FONT> <FONT
color=#ff0000>edx</FONT> first<FONT color=#3080ca>:</FONT><FONT
color=#ff0000>DWORD</FONT><FONT color=#9932cd><B>,</B></FONT> second<FONT
color=#3080ca>:</FONT><FONT color=#ff0000>DWORD</FONT><BR><A
name=L99> <FONT color=#ff0000>invoke</FONT>
GetTickCount <FONT color=#238e23>; 取得隨機數種子,當然,可用別的方法代替</FONT><BR><A
name=L100> <FONT color=#ff0000>mov</FONT> <FONT
color=#ff0000>ecx</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT
color=#802000>23</FONT>
<FONT color=#238e23>; X = ecx = 23</FONT><BR><A
name=L101> <FONT color=#ff0000>mul</FONT> <FONT
color=#ff0000>ecx</FONT>
<FONT color=#238e23>; eax = eax * X</FONT><BR><A
name=L102> <FONT color=#ff0000>add</FONT> <FONT
color=#ff0000>eax</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT
color=#802000>7</FONT> <FONT
color=#238e23>; eax = eax + Y (Y = 7)</FONT><BR><A
name=L103> <FONT color=#ff0000>mov</FONT> <FONT
color=#ff0000>ecx</FONT><FONT color=#9932cd><B>,</B></FONT>
second <FONT color=#238e23>; ecx = 上限</FONT><BR><A
name=L104> <FONT color=#ff0000>sub</FONT> <FONT
color=#ff0000>ecx</FONT><FONT color=#9932cd><B>,</B></FONT>
first <FONT color=#238e23>; ecx = 上限 -
下限</FONT><BR><A name=L105> <FONT
color=#ff0000>inc</FONT> <FONT
color=#ff0000>ecx</FONT>
<FONT color=#238e23>; Z = ecx + 1 (得到了范圍)</FONT><BR><A
name=L106> <FONT color=#ff0000>xor</FONT> <FONT
color=#ff0000>edx</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT
color=#ff0000>edx</FONT> <FONT
color=#238e23>; edx = 0</FONT><BR><A
name=L107> <FONT color=#ff0000>div</FONT> <FONT
color=#ff0000>ecx</FONT>
<FONT color=#238e23>; eax = eax mod Z (余數在edx里面)</FONT><BR><A
name=L108> <FONT color=#ff0000>add</FONT> <FONT
color=#ff0000>edx</FONT><FONT color=#9932cd><B>,</B></FONT>
first <FONT color=#238e23>;
修正產生的隨機數的范圍</FONT><BR><A name=L109> <FONT
color=#ff0000>mov</FONT> <FONT color=#ff0000>eax</FONT><FONT
color=#9932cd><B>,</B></FONT> <FONT
color=#ff0000>edx</FONT> <FONT
color=#238e23>; eax = Rand_Number</FONT><BR><A
name=L110> <FONT color=#ff0000>ret</FONT><BR><A
name=L111>iRand <FONT
color=#ff0000>endp</FONT></A></TD></TR></TBODY></TABLE><BR>然后用以下語句調用:<BR><BR>
<TABLE cellSpacing=0 cellPadding=0 bgColor=#fbedbb border=0>
<TBODY>
<TR>
<TD><FONT color=#ff0000>invoke</FONT> iRand<FONT
color=#9932cd><B>,</B></FONT> <FONT color=#802000>1</FONT><FONT
color=#9932cd><B>,</B></FONT> <FONT
color=#802000>100</FONT></TD></TR></TBODY></TABLE><BR>這樣就產生了一個在 1 和 100
之間的隨機數啦。<BR><BR>是不是很簡單呢?最后我再給出一個利用本代碼的例子,演示如何生成隨機數:<BR><BR>
<TABLE cellSpacing=0 cellPadding=0 bgColor=#fbedbb border=0>
<TBODY>
<TR>
<TD><A name=L1><FONT
color=#238e23>;*********************************************************</FONT><BR><A
name=L2><FONT color=#238e23>;程序名稱:隨機數的產生原理與實現</FONT><BR><A name=L3><FONT
color=#238e23>;作者:羅聰</FONT><BR><A name=L4><FONT
color=#238e23>;日期:2002-11-21</FONT><BR><A name=L5><FONT
color=#238e23>;出處:http://www.LuoCong.com(老羅的繽紛天地)</FONT><BR><A
name=L6><FONT color=#238e23>;注意事項:如欲轉載,請保持本程序的完整,并注明:</FONT><BR><A
name=L7><FONT
color=#238e23>;轉載自“老羅的繽紛天地”(http://www.LuoCong.com)</FONT><BR><A
name=L8><FONT
color=#238e23>;*********************************************************</FONT><BR><A
name=L9><BR><A name=L10><FONT color=#9932cd><B>.</B></FONT><FONT
color=#802000>386</FONT><BR><A name=L11><FONT
color=#9932cd><B>.</B></FONT><FONT color=#ff0000>model</FONT> <FONT
color=#ff0000>flat</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT
color=#ff0000>stdcall</FONT><BR><A name=L12><FONT
color=#ff0000>option</FONT> <FONT color=#ff0000>casemap</FONT><FONT
color=#3080ca>:</FONT>none<BR><A name=L13><BR><A name=L14><FONT
color=#ff8000>include</FONT> \masm32\include\windows.inc<BR><A
name=L15><FONT color=#ff8000>include</FONT>
\masm32\include\kernel32.inc<BR><A name=L16><FONT
color=#ff8000>include</FONT> \masm32\include\user32.inc<BR><A
name=L17><FONT color=#ff8000>includelib</FONT>
\masm32\lib\kernel32.lib<BR><A name=L18><FONT
color=#ff8000>includelib</FONT> \masm32\lib\user32.lib<BR><A
name=L19><BR><A
name=L20>WndProc <FONT
color=#ff0000>proto</FONT> <FONT color=#3080ca>:</FONT><FONT
color=#ff0000>DWORD</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT
color=#3080ca>:</FONT><FONT color=#ff0000>DWORD</FONT><FONT
color=#9932cd><B>,</B></FONT> <FONT color=#3080ca>:</FONT><FONT
color=#ff0000>DWORD</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT
color=#3080ca>:</FONT><FONT color=#ff0000>DWORD</FONT><BR><A
name=L21>iRand
<FONT color=#ff0000>proto</FONT> <FONT color=#3080ca>:</FONT><FONT
color=#ff0000>DWORD</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT
color=#3080ca>:</FONT><FONT color=#ff0000>DWORD</FONT><BR><A
name=L22><BR><A name=L23><FONT color=#9932cd><B>.</B></FONT><FONT
color=#ff0000>const</FONT><BR><A name=L24>IDC_BUTTON_GENERATE <FONT
color=#ff0000>equ</FONT> <FONT color=#802000>3000</FONT><BR><A
name=L25>IDC_EDIT_FIRST <FONT
color=#ff0000>equ</FONT> <FONT color=#802000>3001</FONT><BR><A
name=L26>IDC_EDIT_SECOND <FONT
color=#ff0000>equ</FONT> <FONT color=#802000>3002</FONT><BR><A
name=L27><BR><A name=L28><FONT color=#9932cd><B>.</B></FONT><FONT
color=#ff0000>data</FONT><BR><A
name=L29>szDlgName
<FONT color=#ff0000>db</FONT> <FONT
color=#0000ff>"lc_dialog"</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT
color=#802000>0</FONT><BR><A
name=L30>szCaption
<FONT color=#ff0000>db</FONT> <FONT color=#0000ff>"Rand Number
Generator by LC"</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT
color=#802000>0</FONT><BR><A
name=L31>szText <FONT
color=#ff0000>db</FONT> <FONT color=#802000>255</FONT> <FONT
color=#ff0000>dup</FONT><FONT color=#ff00ff>(</FONT><FONT
color=#802000>0</FONT><FONT color=#ff00ff>)</FONT><BR><A
name=L32>szTemplate <FONT
color=#ff0000>db</FONT> <FONT color=#0000ff>"(%d ~
%d)隨機數:"</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT
color=#802000>13</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT
color=#802000>10</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT
color=#802000>13</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT
color=#802000>10</FONT><FONT color=#9932cd><B>,</B></FONT><FONT
color=#3080ca>\</FONT><BR><A
name=L33> <FONT
color=#0000ff>"
%d"</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT
color=#802000>13</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT
color=#802000>10</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT
color=#802000>13</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT
color=#802000>10</FONT><FONT color=#9932cd><B>,</B></FONT><FONT
color=#3080ca>\</FONT><BR><A
name=L34> <FONT
color=#0000ff>"老羅的繽紛天地"</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT
color=#802000>13</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT
color=#802000>10</FONT><FONT color=#9932cd><B>,</B></FONT><FONT
color=#3080ca>\</FONT><BR><A
name=L35> <FONT
color=#0000ff>"http://www.LuoCong.com"</FONT><FONT
color=#9932cd><B>,</B></FONT> <FONT color=#802000>0</FONT><BR><A
name=L36>nFirst <FONT
color=#ff0000>dd</FONT> <FONT color=#802000>0</FONT><BR><A
name=L37>nSecond
<FONT color=#ff0000>dd</FONT> <FONT
color=#802000>0</FONT><BR><A name=L38><BR><A name=L39><FONT
color=#9932cd><B>.</B></FONT><FONT color=#ff0000>code</FONT><BR><A
name=L40>main<FONT color=#3080ca>:</FONT><BR><A
name=L41> <FONT color=#ff0000>invoke</FONT>
GetModuleHandle<FONT color=#9932cd><B>,</B></FONT> NULL<BR><A
name=L42> <FONT color=#ff0000>invoke</FONT>
DialogBoxParam<FONT color=#9932cd><B>,</B></FONT> <FONT
color=#ff0000>eax</FONT><FONT color=#9932cd><B>,</B></FONT> <FONT
color=#ff0000>offset</FONT> szDlgName<FONT color=#9932cd><B>,</B></FONT>
<FONT color=#802000>0</FONT><FONT color=#9932cd><B>,</B></FONT>
WndProc<FONT color=#9932cd><B>,</B></FONT> <FONT
color=#802000>0</FONT><BR><A name=L43> <FONT
color=#ff0000>invoke</FONT> ExitProcess<FONT color=#9932cd><B>,</B></FONT>
<FONT color=#ff0000>eax</FONT><BR><A name=L44><BR><A name=L45>WndProc
<FONT color=#ff0000>proc</FONT> hWnd<FONT color=#3080ca>:</FONT>HWND<FONT
color=#9932cd><B>,</B></FONT> uMsg<FONT color=#3080ca>:</FONT>UINT<FONT
color=#9932cd><B>,</B></FONT> wParam<FONT
color=#3080ca>:</FONT>WPARAM<FONT color=#9932cd><B>,</B></FONT>
lParam<FONT color=#3080ca>:</FONT>LPARAM<BR><A
name=L46> <FONT color=#ff0000>LOCAL</FONT>
hEdit<FONT color=#3080ca>:</FONT> HWND<BR><A name=L47><BR><A
name=L48> <FONT color=#9932cd><B>.</B></FONT><FONT
color=#ff0000>if</FONT> uMsg <FONT color=#3080ca>=</FONT><FONT
color=#3080ca>=</FONT> WM_CLOSE<BR><A
name=L49> <FONT
color=#ff0000>invoke</FONT> EndDialog<FONT color=#9932cd><B>,</B></FONT>
hWnd<FONT color=#9932cd><B>,</B></FONT> <FONT color=#802000>0</FONT><BR><A
name=L50> <BR><A
name=L51> <FONT color=#9932cd><B>.</B></FONT><FONT
color=#ff0000>elseif</FONT> uMsg <FONT color=#3080ca>=</FONT><FONT
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -