?? 隨機(jī)數(shù)的產(chǎn)生原理與實(shí)現(xiàn) 老羅的繽紛天地.htm
字號(hào):
color=#3080ca>=</FONT> WM_COMMAND<BR><A
name=L52> <FONT
color=#ff0000>mov</FONT> <FONT color=#ff0000>eax</FONT><FONT
color=#9932cd><B>,</B></FONT> wParam<BR><A
name=L53> <FONT
color=#ff0000>mov</FONT> <FONT color=#ff0000>edx</FONT><FONT
color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>eax</FONT><BR><A
name=L54> <FONT
color=#ff0000>shr</FONT> <FONT color=#ff0000>edx</FONT><FONT
color=#9932cd><B>,</B></FONT> <FONT color=#802000>16</FONT><BR><A
name=L55> <FONT
color=#ff0000>movzx</FONT> <FONT color=#ff0000>eax</FONT><FONT
color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>ax</FONT><BR><A
name=L56> <FONT
color=#9932cd><B>.</B></FONT><FONT color=#ff0000>if</FONT> <FONT
color=#ff0000>edx</FONT> <FONT color=#3080ca>=</FONT><FONT
color=#3080ca>=</FONT> BN_CLICKED<BR><A
name=L57> <FONT
color=#9932cd><B>.</B></FONT><FONT color=#ff0000>if</FONT> <FONT
color=#ff0000>eax</FONT> <FONT color=#3080ca>=</FONT><FONT
color=#3080ca>=</FONT> IDCANCEL<BR><A
name=L58> <FONT
color=#ff0000>invoke</FONT> EndDialog<FONT color=#9932cd><B>,</B></FONT>
hWnd<FONT color=#9932cd><B>,</B></FONT> NULL<BR><A
name=L59> <FONT
color=#9932cd><B>.</B></FONT><FONT color=#ff0000>elseif</FONT> <FONT
color=#ff0000>eax</FONT> <FONT color=#3080ca>=</FONT><FONT
color=#3080ca>=</FONT> IDC_BUTTON_GENERATE <FONT
color=#3080ca>|</FONT><FONT color=#3080ca>|</FONT> <FONT
color=#ff0000>eax</FONT> <FONT color=#3080ca>=</FONT><FONT
color=#3080ca>=</FONT> IDOK<BR><A
name=L60> <FONT
color=#238e23>;獲得上限:</FONT><BR><A
name=L61> <FONT
color=#ff0000>invoke</FONT> GetDlgItemInt<FONT
color=#9932cd><B>,</B></FONT> hWnd<FONT color=#9932cd><B>,</B></FONT>
IDC_EDIT_FIRST<FONT color=#9932cd><B>,</B></FONT> NULL<FONT
color=#9932cd><B>,</B></FONT> TRUE<BR><A
name=L62> <FONT
color=#ff0000>mov</FONT> nFirst<FONT color=#9932cd><B>,</B></FONT> <FONT
color=#ff0000>eax</FONT><BR><A
name=L63> <FONT
color=#238e23>;獲得下限:</FONT><BR><A
name=L64> <FONT
color=#ff0000>invoke</FONT> GetDlgItemInt<FONT
color=#9932cd><B>,</B></FONT> hWnd<FONT color=#9932cd><B>,</B></FONT>
IDC_EDIT_SECOND<FONT color=#9932cd><B>,</B></FONT> NULL<FONT
color=#9932cd><B>,</B></FONT> TRUE<BR><A
name=L65> <FONT
color=#ff0000>mov</FONT> nSecond<FONT color=#9932cd><B>,</B></FONT> <FONT
color=#ff0000>eax</FONT><BR><A
name=L66> <FONT
color=#238e23>;產(chǎn)生隨機(jī)數(shù):</FONT><BR><A
name=L67> <FONT
color=#ff0000>invoke</FONT> iRand<FONT color=#9932cd><B>,</B></FONT>
nFirst<FONT color=#9932cd><B>,</B></FONT> nSecond<BR><A
name=L68> <FONT
color=#238e23>;輸出:</FONT><BR><A
name=L69> <FONT
color=#ff0000>invoke</FONT> wsprintf<FONT color=#9932cd><B>,</B></FONT>
<FONT color=#ff0000>addr</FONT> szText<FONT color=#9932cd><B>,</B></FONT>
<FONT color=#ff0000>addr</FONT> szTemplate<FONT
color=#9932cd><B>,</B></FONT> nFirst<FONT color=#9932cd><B>,</B></FONT>
nSecond<FONT color=#9932cd><B>,</B></FONT> <FONT
color=#ff0000>eax</FONT><BR><A
name=L70> <FONT
color=#ff0000>invoke</FONT> MessageBox<FONT color=#9932cd><B>,</B></FONT>
hWnd<FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>addr</FONT>
szText<FONT color=#9932cd><B>,</B></FONT> <FONT color=#ff0000>addr</FONT>
szCaption<FONT color=#9932cd><B>,</B></FONT> MB_OK <FONT
color=#ff0000>or</FONT> MB_ICONINFORMATION<BR><A
name=L71> <FONT
color=#9932cd><B>.</B></FONT><FONT color=#ff0000>endif</FONT><BR><A
name=L72> <FONT
color=#9932cd><B>.</B></FONT><FONT color=#ff0000>endif</FONT><BR><A
name=L73> <FONT color=#9932cd><B>.</B></FONT><FONT
color=#ff0000>else</FONT><BR><A
name=L74> <FONT
color=#ff0000>mov</FONT> <FONT color=#ff0000>eax</FONT><FONT
color=#9932cd><B>,</B></FONT> FALSE<BR><A
name=L75> <FONT
color=#ff0000>ret</FONT><BR><A name=L76> <FONT
color=#9932cd><B>.</B></FONT><FONT color=#ff0000>endif</FONT><BR><A
name=L77> <FONT color=#ff0000>mov</FONT> <FONT
color=#ff0000>eax</FONT><FONT color=#9932cd><B>,</B></FONT> TRUE<BR><A
name=L78> <FONT color=#ff0000>ret</FONT><BR><A
name=L79>WndProc <FONT color=#ff0000>endp</FONT><BR><A name=L80><BR><A
name=L81><FONT
color=#238e23>;**********************************************************************</FONT><BR><A
name=L82><FONT color=#238e23>; 函數(shù)功能:產(chǎn)生范圍從 first 到 second 的隨機(jī)數(shù)</FONT><BR><A
name=L83><FONT color=#238e23>; 傳入?yún)?shù):</FONT><BR><A name=L84><FONT
color=#238e23>;
first = 下限</FONT><BR><A name=L85><FONT
color=#238e23>;
second = 上限</FONT><BR><A name=L86><FONT color=#238e23>; 返回參數(shù):</FONT><BR><A
name=L87><FONT
color=#238e23>;
eax = Rand_Number</FONT><BR><A name=L88><FONT color=#238e23>;
所用公式:</FONT><BR><A name=L89><FONT
color=#238e23>;
Rand_Number = (Rand_Seed * X + Y) mod Z</FONT><BR><A name=L90><FONT
color=#238e23>; 補(bǔ)充說(shuō)明:</FONT><BR><A name=L91><FONT
color=#238e23>;
(1)本例中用 GetTickCount 來(lái)取得隨機(jī)數(shù)種子,</FONT><BR><A name=L92><FONT
color=#238e23>; 在實(shí)際應(yīng)用中,可用別的方法代替。</FONT><BR><A
name=L93><FONT
color=#238e23>;
(2)要產(chǎn)生隨機(jī)數(shù),X和Y其中之一必須是素?cái)?shù),</FONT><BR><A name=L94><FONT
color=#238e23>; 所以
X = 23, Y = 7(可用別的素?cái)?shù)代替)</FONT><BR><A name=L95><FONT
color=#238e23>;**********************************************************************</FONT><BR><A
name=L96>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=L97> <FONT color=#ff0000>invoke</FONT>
GetTickCount <FONT color=#238e23>; 取得隨機(jī)數(shù)種子,當(dāng)然,可用別的方法代替</FONT><BR><A
name=L98> <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=L99> <FONT color=#ff0000>mul</FONT> <FONT
color=#ff0000>ecx</FONT>
<FONT color=#238e23>; eax = eax * X</FONT><BR><A
name=L100> <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=L101> <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=L102> <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=L103> <FONT
color=#ff0000>inc</FONT> <FONT
color=#ff0000>ecx</FONT>
<FONT color=#238e23>; Z = ecx + 1 (得到了范圍)</FONT><BR><A
name=L104> <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=L105> <FONT color=#ff0000>div</FONT> <FONT
color=#ff0000>ecx</FONT>
<FONT color=#238e23>; eax = eax mod Z (余數(shù)在edx里面)</FONT><BR><A
name=L106> <FONT color=#ff0000>add</FONT> <FONT
color=#ff0000>edx</FONT><FONT color=#9932cd><B>,</B></FONT>
first <FONT color=#238e23>;
修正產(chǎn)生的隨機(jī)數(shù)的范圍</FONT><BR><A name=L107> <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=L108> <FONT color=#ff0000>ret</FONT><BR><A
name=L109>iRand <FONT color=#ff0000>endp</FONT><BR><A
name=L110><BR><A name=L111><FONT color=#ff0000>end</FONT> main<BR><A
name=L112><FONT color=#238e23>;********************
over ********************</FONT><BR><A
name=L113><FONT color=#238e23>;by
LC</FONT></A></TD></TR></TBODY></TABLE><BR>它的資源文件:<BR><BR>
<TABLE cellSpacing=0 cellPadding=0 bgColor=#fbedbb border=0>
<TBODY>
<TR>
<TD>#include "resource.h"<BR><BR>#define IDC_BUTTON_GENERATE
3000<BR>#define
IDC_EDIT_FIRST 3001<BR>#define
IDC_EDIT_SECOND 3002<BR>#define
IDC_STATIC -1<BR><BR>LC_DIALOG
DIALOGEX 10, 10, 210, 60<BR>STYLE DS_SETFONT | DS_CENTER | WS_MINIMIZEBOX
| WS_VISIBLE | WS_CAPTION | WS_SYSMENU<BR>CAPTION "Rand Number Generator
by LC, 2002-11-21"<BR>FONT 8, "MS Sans
Serif"<BR>BEGIN<BR> LTEXT
"Please input the range below:", IDC_STATIC, 5, 5, 200,
10<BR> RTEXT
"From:", IDC_STATIC, 10, 20, 20,
10<BR> EDITTEXT IDC_EDIT_FIRST,
30, 20, 70, 10, ES_AUTOHSCROLL | NOT WS_BORDER,
WS_EX_STATICEDGE<BR> RTEXT
"To:", IDC_STATIC, 110, 20, 20,
10<BR> EDITTEXT IDC_EDIT_SECOND,
130, 20, 70, 10, ES_AUTOHSCROLL | NOT WS_BORDER,
WS_EX_STATICEDGE<BR> DEFPUSHBUTTON
"Generate(&G)", IDC_BUTTON_GENERATE, 70, 40, 50, 13, BS_FLAT |
BS_CENTER<BR>END</TD></TR></TBODY></TABLE><BR><BR><B>如果您還有什么疑問(wèn),或者發(fā)現(xiàn)了我的表述和理解有誤,歡迎來(lái)信交流。<A
title=歡迎來(lái)信交流!
href="mailto:lcother@163.net?subject=老羅,有關(guān)隨機(jī)數(shù)的問(wèn)題想跟你探討。">mailto:lcother@163.net?subject=老羅,有關(guān)隨機(jī)數(shù)的問(wèn)題想跟你探討。</A></B>
</P>
<P align=right>老羅<BR>2002-11-22 </P><!-- Page published by Emacs Wiki ends here -->
<DIV class=navfoot>
<HR>
<TABLE width="100%" summary="Footer navigation" border=0>
<TBODY>
<TR>
<TD align=left width="33%"><SPAN class=footdate>版權(quán)所有 轉(zhuǎn)載請(qǐng)注明出處</SPAN> </TD>
<TD align=middle width="34%"><SPAN class=foothome><A
href="http://www.luocong.com/">Home</A> / <A
href="http://www.luocong.com/articles/WikiIndex.htm">Index</A> </SPAN></TD>
<TD align=right width="33%"><SPAN class=footfeed><A
href="http://www.luocong.com/" target=_blank>羅聰</A></SPAN>
</TD></TR></TBODY></TABLE></DIV></BODY></HTML>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -