在日常工作中,有很多场合需要用到随机数。做实验的时候,可能需要一些随机数进行测试;很多产品厂商需要给自己的产品分配随机序列号,或者给VIP用户卡分配随机卡号。所以,在Windows环境下,
怎样才能自动生成符合自己需求的随机数?
1.特定区间内普通随机数的生成
如果我们在实验过程中需要生成一个特定区间的随机数,可以先通过大家熟悉的Excel软件创建。主要利用RAND和RANDBETWEEN函数实现。
例如,函数“=RAND()”可用于生成0到1范围内的随机数。要生成0到10之间的随机数,可以使用函数表达式“=rand()* 10”;如果你需要一个1到10之间的随机数,
使用表达式“RAND()*(10-1) 1”。同样,如果需要0到100之间的随机数,使用“RAND()*100”函数表达式;1到100之间的随机数,
使用“RAND()*(100-1) 2”函数表达式(图1)。
我们注意到上面的随机数是十进制的。那么,如果你想生成整数呢?有两种方式,一种是对生成的小数随机数进行四舍五入,另一种是直接生成整数随机数。
例如,第一个示例将TRUNC()函数添加到表达式“RAND()*(100-1) 2”中,以生成1到100之间的随机整数。
整个表达式表示为“=trunc(rand()*(100-1)2)”;第二个可以直接使用RANDBETWEEN()函数,用表达式“=RANDBETWEEN(0,10)”生成0到10之间的随机整数。
表达式“=RANDBETWEEN(50,9999)”生成一个介于50和9999之间的随机整数(图2)。可以看出,RANDBETWEEN()函数更加形象,使用起来也更加简单。
如果你觉得用以上方式生成区间随机数比较麻烦,可以用第三方工具软件实现。比如使用随机数生成器,方便设置随机数区域,限制条件,从而自动生成符合条件的随机数。
软件运行后,在左上方的间隔后的两个框中输入由随机数生成的范围值,在小数点后的位数后输入截断的小数位数。
在要生成的位数后输入每次生成的随机数个数。之后,单击“生成整数”按钮生成指定数量的随机整数。
单击Generate decimal生成相应的随机小数(图3)。
在设置好生成随机数的条件后,也可以通过快捷键来完成创建随机数的操作。按功能键F1创建指定范围的整数,按F2生成指定范围的小数,按F4清除随机数列表。如果要产生大量的随机数,
要查找某个特定的随机数是否存在,可以使用Find按钮查找,找到后自动定位该随机数(图4)。如果想中途停止随机数的生成,可以按Esc。
提示:如果要生成不重复的随机数,请选中“下一个随机数不等于当前随机数”复选框。如果您想要复制生成的随机数或随机数列表,
使用软件窗口左下角的几个按钮进行操作。
2.特定格式的产品序列号的生成
作为产品厂商的工作人员,有两种方式可以为自己的软硬件产品安排序列号,或者让厂商为客户的VIP卡配置序列号。
首先,可以使用Excel的随机函数表达式。假设你要生成一个随机数序列号,形状为“123-456”,由两个三位数和连字符组成。
可以使用函数表达式“=rand between (100,999)”--“rand between(100,999)”。其中“,”符号连接前后的结果,“-”表示前后两个随机数由指定的连字符连接。
可使用“=RANDBETWEEN(100000,999999) ' - ' RANDBETWEEN(100000,999999) ' - ' ' - ' RANDBETWEEN(100000,999999) ' - ' RANDBETWEEN(100000,999999) ' - ' RANDBETWEEN(100000,999999) ' - ' RANDBETWEEN(100000,999999)”函数表达式(图5)。
序列号的生成还可以使用第三方专用工具,如Portable Abluescarab Software CD-Key Generator软件。首次使用该软件弹出提示,需要进行参数配置,
配置参数主要有序列号的段数和每段的字符数两个参数(图6)。
进入序列号生成器的主窗口后,先通过下拉列表,在使用数字、字符、数字+字符3种方式中选择一种,再通过下面的复选框选择是否使用小写字母,然后点击Generate按钮,即可建立一组序列号(图7)。
小提示:虽然该软件为CD-Key而设计,但生成其他产品序列号同样适用。
[!--empirenews.page--]
相关阅读:
一、c语言中的算法采用线性同余算法产生,首先要设置seed(),线性同余算法的随机性很差,不能满足加密的要求
二、windows下随机数的生成:
有两种方法可以生产随机数,包括:线性适配随机发生器和不可预测随机数发生器。
线性适配随机发生器:
在许多程序设计中,都简单地调用了相关的随机函数。比如windows下Microsoft Visual C++6.0 中的rand(),在C 运行库(C Run Time lib,CRT)中,
其定义类似如下(为了简洁起见,n省略了多线程程序部分等)。
int holdrand=1;
int _cdecl rand(void)
{ return ((holdrand=holdrand*214013L+25310112)16)0x7fff}; }
该类型的函数被称为线性适配函数(linear congruential function)。 此类函数的一个的缺点就是可预测性,因为上一个随机数是下个随机数的种子,具有很强的相关性。
其中两次与之相关的重要事件有:
Netscape Navigator浏览器早期版本的攻击可能是最著名的可预测随机攻击,其中用于其SSL(Secure Sockets Layer,安全套接字层)密钥的随机数有着很高的可预测性,
使得SSL 失去意义。
另一个就是攻击ASF软件公司的TexasHoldem Poker应用程序。这种“发牌”软件在算法中利用了Borland Delphi的随机函数。
这个随机函数是类似于上面提及的CRT中的简单线性适配函数:rand()函数。
2. 不可预测随机数发生器
2.1 随机数发生器特性
一个好(或称健壮)的随机数发生器有着一下以下三个特性: 产生平均的数; 数据不可预测; 取值范围长且完整(即:它能产生大量的不同值的随机数,而且在取值范围内的所有数值能够被生成)。
线性适配函数产生的随机数,仅满足第一个特性,第二个特性非常糟糕。换言之,rand()
函数可以生成一系列平均分布的数,但每一个数却有很强的可预测性。
2.2 不可预测随机发生器设计
它适用于Windows XP, Windows 2000 Professional, Windows NT Workstation 4.0, Windows Me, Windows 98, or Windows 95 OSR2 或更高版本,
CryptGenRandom从Windows2000的众多的资源中,
获得其随机性[也称作“熵”(entropy)]:当前进程的ID;当前线程的ID;系统引导以来的时钟数;各种高精度的性能计数器;用户环境模块的MD4(Message Digest 4,
信息摘要4)散列,包括用户名,计算机名和搜索路径等;高精度的内部CPU计算器,如RDISC,ROMSR,RDPM等;底层系统信息,如空闲时间,内检时刻,中断时间,提交限定,页面计数,缓存计数,
操作系统外部计数等。
(1) CryptGenRandom()函数的一般使用
首先通过CryptAcquireContext 获取一个CSP (cryptographic service provider)提供的句柄,定义如下:
BOOL WINAPI CryptAcquireContext(
HCRYPTPROV* phProv,
LPCTSTR pszContainer,
LPCTSTR pszProvider,
DWORD dwProvType,
DWORD dwFlags
)
参数说明:
phProv : 一个密码的服务提供者(cryptographic service provider,CSP)的句柄指针。
PszContainer:关键字容器的名字。当dwFlags 被设为CRYPT_VERIFYCONTEXT 时, pszContainer 必须被设为0。
一般pszContainer 为NULL时,一个缺省钥匙容器名字被使用。
例如,微软基本密码提供者(Microsoft Base Cryptographic Provider)的用户使用其当前登录名字当前作为关键字容器名字登录。
PszProvider:指定的CSP提供者的名字,是以0结尾的字符串。如果这个参数是空的,用户缺省供应商被使用。
DwProvType:指定CSP提供者的类型,取值可如下。
PROV_RSA_FULL PROV_SSL
PROV_RSA_SIG PROV_EC_ECDSA_SIG
PROV_DSS PROV_EC_ECNRA_SIG
PROV_DSS_DH PROV_EC_ECDSA_FULL
PROV_FORTEZZA PROV_EC_ECNRA_FULL
PROV_MS_EXCHANGE PROV_SPYRUS_LYNKS
PROV_RSA_SCHANNEL
其中,PROV_RSA_FULL 标识,表示提供者同时支持数字签名(Digital signatures)和数据加密(Data encryption),为通用的一般的设置(其他的具体含义,
可参看MSDN)。
DwFlags: 标志值。这个参数通常被设为零。 但是应用程序也可以设置至少一个下列标志: CRYPT_VERIFYCONTEXT,CRYPT_NEWKEYSET,
CRYPT_MACHINE_KEYSET,CRYPT_DELETEKEYSET(其具体含义,可参看MSDN)。
返回值:如果函数调用成功,返回值是非零(TRUE );反之,为0(FALSE)。
调用CryptGenRandom()函数,同时将产生的随机数据填充到缓存区中。
BOOL WINAPI CryptGenRandom(
HCRYPTPROV hProv,
DWORD dwLen,
BYTE* pbBuffer
);
参数说明:
hProv :是一个由CSP(cryptographic service provider)句柄,它由CryptAcquireContext函数调用获得的。
dwLen :缓存区的大小。
pbBuffer :存放返回随机数据的缓存区。
返回值:
调用成功则返回TRUE;反之为FALSE。
使用完毕释放句柄和关键字容器:CryptReleaseContext()。
调用CryptReleaseContext将释放一个CSP 句柄;同时,每调用一次,引用计数(Reference count)将减1,当引用计数为零时,则CSP上下文(context)将被彻底释放,
不再能被其他应用所使用。其定义如下:
BOOL WINAPI CryptReleaseContext(
HCRYPTPROV hProv,
DWORD dwFlags
);
参数说明:
hProv :欲释放的一个CSP 句柄
dwFlags :保留使用,一般设为0。
返回值:调用成功则返回非零(TRUE)。