随机数的产生原理与实现
来源:百度文库 编辑:神马文学网 时间:2024/06/03 07:01:23
下载本节例子程序和源代码 (3.91 KB)
随机数的产生在病毒中占有十分重要的地位,尤其是在变形引擎中,没有它就不成事了……因此,今天就让我们来探讨一下如何产生一个随机数。
首先值得说明的是,要产生一个随机数,方法有很多种,例如混沌和分形理论(原理比较复杂,但是公式却异常简单,将来有空的话我会介绍一下)……但是这些方法的缺点是计算难度大,需要花费的时间多,有没有一种实现起来比较简单的方法呢?
答案是肯定的。我们先来看一条数学公式:
Rand_Number = (Rand_Seed * X + Y) mod Z
利用这条公式,我们就可以生成一个伪随机数了。可是为什么是“伪随机数”呢?因为实际上要保证每次生成的随机数都不同,那是不太可能的,我们唯一能做到的只能是尽量使每次生成的数字与前面的不同,并且尽量使生成的数字均匀分布在指定的范围内。
上面的这条公式就能满足这两点。至于为什么……呵呵,我也不懂,因为它牵涉到十分复杂的数学求证过程,我们只需要知道如何应用就成了:
Rand_Seed 表示随机数种子,注意这个“种子”必须每次都不同,我们可以简单地利用 GetTickCount() 这个 API 来获得不同的数字,当然,你也可以用别的方法来取得,例如读取当前鼠标的坐标等等……
X、Y必须至少有一个为素数。什么叫素数?Hoho,让我们来翻翻小学课本……素数就是除了 1 和它本身,不能被其他数整除的数字。在这里我们可以简单地给 X、Y 赋值 23 和 7 ,其实别的素数也行,我只是随便取了这两个数字。
最后,Z 也应该是一个素数,这样才能保证产生的随机数能得到上限的值。不过我在实践中发现,这个 Z 不一定要准确地为素数。Why? I also don’t know...
总结一下,利用以上的公式,我们可以编写汇编代码如下:
然后用以下语句调用:
invoke iRand, 1, 100
这样就产生了一个在 1 和 100 之间的随机数啦。
是不是很简单呢?最后我再给出一个利用本代码的例子,演示如何生成随机数:
它的资源文件:
#include "resource.h"
#define IDC_BUTTON_GENERATE 3000
#define IDC_EDIT_FIRST 3001
#define IDC_EDIT_SECOND 3002
#define IDC_STATIC -1
LC_DIALOG DIALOGEX 10, 10, 210, 60
STYLE DS_SETFONT | DS_CENTER | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Rand Number Generator by LC, 2002-11-21"
FONT 8, "MS Sans Serif"
BEGIN
LTEXT "Please input the range below:", IDC_STATIC, 5, 5, 200, 10
RTEXT "From:", IDC_STATIC, 10, 20, 20, 10
EDITTEXT IDC_EDIT_FIRST, 30, 20, 70, 10, ES_AUTOHSCROLL | NOT WS_BORDER, WS_EX_STATICEDGE
RTEXT "To:", IDC_STATIC, 110, 20, 20, 10
EDITTEXT IDC_EDIT_SECOND, 130, 20, 70, 10, ES_AUTOHSCROLL | NOT WS_BORDER, WS_EX_STATICEDGE
DEFPUSHBUTTON "Generate(&G)", IDC_BUTTON_GENERATE, 70, 40, 50, 13, BS_FLAT | BS_CENTER
END
随机数的产生在病毒中占有十分重要的地位,尤其是在变形引擎中,没有它就不成事了……因此,今天就让我们来探讨一下如何产生一个随机数。
首先值得说明的是,要产生一个随机数,方法有很多种,例如混沌和分形理论(原理比较复杂,但是公式却异常简单,将来有空的话我会介绍一下)……但是这些方法的缺点是计算难度大,需要花费的时间多,有没有一种实现起来比较简单的方法呢?
答案是肯定的。我们先来看一条数学公式:
Rand_Number = (Rand_Seed * X + Y) mod Z
利用这条公式,我们就可以生成一个伪随机数了。可是为什么是“伪随机数”呢?因为实际上要保证每次生成的随机数都不同,那是不太可能的,我们唯一能做到的只能是尽量使每次生成的数字与前面的不同,并且尽量使生成的数字均匀分布在指定的范围内。
上面的这条公式就能满足这两点。至于为什么……呵呵,我也不懂,因为它牵涉到十分复杂的数学求证过程,我们只需要知道如何应用就成了:
Rand_Seed 表示随机数种子,注意这个“种子”必须每次都不同,我们可以简单地利用 GetTickCount() 这个 API 来获得不同的数字,当然,你也可以用别的方法来取得,例如读取当前鼠标的坐标等等……
X、Y必须至少有一个为素数。什么叫素数?Hoho,让我们来翻翻小学课本……素数就是除了 1 和它本身,不能被其他数整除的数字。在这里我们可以简单地给 X、Y 赋值 23 和 7 ,其实别的素数也行,我只是随便取了这两个数字。
最后,Z 也应该是一个素数,这样才能保证产生的随机数能得到上限的值。不过我在实践中发现,这个 Z 不一定要准确地为素数。Why? I also don’t know...
总结一下,利用以上的公式,我们可以编写汇编代码如下:
然后用以下语句调用:
invoke iRand, 1, 100
这样就产生了一个在 1 和 100 之间的随机数啦。
是不是很简单呢?最后我再给出一个利用本代码的例子,演示如何生成随机数:
它的资源文件:
#include "resource.h"
#define IDC_BUTTON_GENERATE 3000
#define IDC_EDIT_FIRST 3001
#define IDC_EDIT_SECOND 3002
#define IDC_STATIC -1
LC_DIALOG DIALOGEX 10, 10, 210, 60
STYLE DS_SETFONT | DS_CENTER | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Rand Number Generator by LC, 2002-11-21"
FONT 8, "MS Sans Serif"
BEGIN
LTEXT "Please input the range below:", IDC_STATIC, 5, 5, 200, 10
RTEXT "From:", IDC_STATIC, 10, 20, 20, 10
EDITTEXT IDC_EDIT_FIRST, 30, 20, 70, 10, ES_AUTOHSCROLL | NOT WS_BORDER, WS_EX_STATICEDGE
RTEXT "To:", IDC_STATIC, 110, 20, 20, 10
EDITTEXT IDC_EDIT_SECOND, 130, 20, 70, 10, ES_AUTOHSCROLL | NOT WS_BORDER, WS_EX_STATICEDGE
DEFPUSHBUTTON "Generate(&G)", IDC_BUTTON_GENERATE, 70, 40, 50, 13, BS_FLAT | BS_CENTER
END
随机数的产生原理与实现
随机数的产生原理与实现
随机数产生原理及应用 - 梦想的高度
java产生随机数的几种方式
用rand()和srand()产生伪随机数的方法总结
VB编写的蒙特卡罗方法产生正态分布随机数
CATV机顶盒设计的原理与实现
trackback的原理与实现 trackback扫盲
CATV机顶盒设计的原理与实现()
局域网监听的原理、实现与防范
局域网监听的原理、实现与防范
ORM的实现原理
FrameBuffer 原理、实现与应用
在java中产生随机数的两种方式过程详解
基于SPI的数据报过滤原理与实现
详解Windows系统远程控制的原理与实现
指数分布与泊松分布的随机值的产生程序原理解析
如何通过硬件真正实现随机数生成
浅谈VPN的实现原理
浅谈VPN的实现原理
志灵:官员“坐牢补偿费”的产生原理
c/c 随机数产生相同解决方案 - 帐前卒 专栏 - CSDNBlog
局域网监听的原理、实现与防范 - CoolDiyer‘s Zone - BlogBus.C...
屏幕取词技术实现原理与关键源码 - 淡蓝色的帆 -设计空间 - CSDNBlog