如何自动生成随机数,生成随机数的方法有哪些
在日常工作中,有很多场合需要用到随机数。做实验时,可能需要一些随机数进行检验;很多产品商家需要给产品分配随机序列号,或者给VIP用户卡分配随机卡号。那么,在Windows环境下,如何才能自动生成符合需要的随机数呢?
1.特定区间内普通随机数的生成
如果在实验过程中需要生成特定区间的随机数,可以先用大家熟悉的Excel软件创建。RAND和RANDBETWEEN两个函数用于实现它。
比如你需要生成一个0到1范围内的随机数,可以用函数“=RAND()”来实现;要生成0到10之间的随机数,可以使用函数表达式“=rand()* 10”;如果需要1到10之间的随机数,使用表达式“RAND()*(10-1) 1”。同样,如果需要0到100之间的随机数,使用“RAND()*100”函数表达式;1到100之间的随机数,使用“RAND()*(100-1) 2”函数表达式(图1)。
我们注意到上面的随机数都是小数。那么,如果你想生成一个整数呢?有两种方式,一种是对生成的小数随机数进行四舍五入,另一种是直接生成整数随机数。第一种,比如在表达式“RAND()*(100-1) 2”上加一个TRUNC()函数,生成一个1到100之间的随机整数,整个表达式表示为“=trunc(RAND()*(100-1)2)”;第二种方法可以直接使用RANDBETWEEN()函数,用表达式“=RANDBETWEEN(0,10)”生成0到10之间的随机整数,用表达式“=randbetween (50,999)”生成50到9999(图2)。可以看出,RANDBETWEEN()函数更加形象,使用起来也更加简单。
如果你觉得用以上方式生成区间随机数比较麻烦,可以用第三方工具软件实现。比如利用随机数生成器,方便设置随机数区域,限制条件,从而自动生成符合条件的随机数。
软件运行后,在间隔开始后左上方的两个框中输入随机数生成的范围值,在小数点后的位数后输入截断的小数位数,在要生成的位数后输入每次生成的随机数个数。然后,单击Generate integer按钮生成指定数量的随机整数,单击Generate decimal生成相应的随机小数(图3)。
设置好随机数生成条件后,也可以通过快捷键完成创建随机数的操作。按功能键F1建立指定范围内的整数,按F2生成指定范围内的小数,按F4清除随机数列表。如果要生成大量的随机数,要找出某个特定的随机数是否存在,可以使用Find按钮查找,然后自动定位该随机数(图4)。要在中间停止生成随机数,请按Esc键。
提示:如果要生成不重复的随机数,请选中“下一个随机数不等于当前随机数”复选框。如果想复制一个生成的随机数或者随机数列表,可以通过软件窗口左下角的几个按钮来完成。
2.特定格式产品序列号的生成
作为产品厂商的工作人员,需要为自己的软硬件产品安排序列号,或者卖家为客户的VIP卡配置序列号,也可以通过两种方法实现。
首先可以使用Excel的随机函数表达式。假设要生成一个类似“123-456”的由两个三位数和连字符组成的随机数序列,可以使用“=rand between (100,999)-rand between (100,999)”函数表达式。其中“,”符号连接前后的结果,“-”表示前后两个随机数由指定的连字符连接。
同样,如果要生成一个由四个六位数字组成的随机序列号,可以使用"=rand between (100000,99999)-rand between (100000,99999)-rand between (100000,99999)-Rand between (100000,99999)-Rand between (100000,9999)- Rand between(1000000,99999)
序列号生成也可以使用第三方专用工具,如便携式ablue scarab软件CD-key generator软件。第一次使用软件时,会弹出提示,需要进行参数配置。配置参数主要包括序列号的段数和每段的字符数(图6)。
进入序列号生成器主窗口后,首先通过下拉列表选择数字、字符、数值字符三种使用方式中的一种,然后通过下面的复选框选择是否使用小写字母,再点击生成按钮,创建一组序列号(图7)。
提示:虽然该软件是为CD-Key设计的,但生成其他产品序列号也是适用的。
[!- empirenews.page - ]
相关阅读:
1.C语言中的算法是由线性同余算法生成的。首先,应该设置seed()。线性同余算法的随机性很差,不能满足加密的要求。
二、windows下随机数的生成:
随机数有两种产生方式,包括线性自适应随机数发生器和不可预测随机数发生器。
线性自适应随机发生器;
在很多编程中,相关的随机函数都是简单使用的。例如,在windows下的Microsoft Visual C 6.0中的rand(),在C运行时库(CRT)中,其定义类似于下面的(为简洁起见,n省略了多线程程序等。).
int holdrand=1;
int _cdecl rand(void)
{ return((hold rand=hold rand * 214013 l 25310112)16)0x 7 fff };}
这种类型的函数称为线性自适应函数。这类函数的一个缺点是可预测性,因为上一个随机数是下一个随机数的种子,相关性很强。与之相关的两个重要事件是:
Netscape Navigator浏览器早期版本的攻击可能是最著名的可预测随机攻击,其中用于其SSL(安全套接字层)密钥的随机数具有很高的可预测性,使得SSL变得毫无意义。
另一种是攻击ASF软件公司的TexasHoldem扑克应用。这个“授权”软件在算法中使用了Borland Delphi的随机函数。这个随机函数类似于上面提到的CRT中的简单线性适应函数:rand()函数。
2.不可预测的随机数生成器
2.1随机数发生器的特性
一个好的(或健壮的)随机数发生器有以下三个特点:生成平均数;不可预测的数据;取值范围长且完整(即可以生成大量不同取值的随机数,取值范围内的所有值都可以生成)。
线性适应函数产生的随机数只满足第一个特性,第二个特性很差。换句话说,兰德()
函数可以生成一系列均匀分布的数字,但每个数字都有很强的可预测性。
2.2不可预测随机发生器的设计
在Windows环境下,一个健壮的随机函数是:CryptGenRandom()。它适用于Windows XP、Windows 2000 Professional、Windows NT Workstation 4.0、Windows Me、Windows 98或Windows 95 OSR2或更高版本、Windows Server 2003、Windows 2000 server或Windows 95上的windows nt server 4.0和internet explorer 3.02或更高版本,在Wincrypt.h中定义.
CryptGenRandom从Windows2000的很多资源中获得它的随机性【也叫“熵”】:当前进程的ID;当前线程的ID;系统启动后的时钟数;各种高精度性能计数器;用户环境模块的MD4(Message Digest 4) hash,包括用户名、计算机名、搜索路径等。高精度内置CPU计算器,如RDISC、ROMSR、RDPM等。底层系统信息,如空闲时间、内部检查时间、中断时间、提交限制、页面计数、缓存计数、操作系统外部计数等。
(cryptgenrandom()函数的一般用法
首先通过CryptAcquireContext获取CSP(加密服务提供商)提供的一个句柄,定义如下:
BOOL WINAPI CryptAcquireContext(
HCRYPTPROV* phProv,
LPCTSTR pszContainer,
LPCTSTR pszProvider,
DWORD dwProvType,
DWORD双旗
)
参数描述:
PhProv:加密服务提供者(CSP)的句柄指针。
PszContainer:关键字容器的名称。当dwFlags设置为CRYPT_VERIFYCONTEXT时,pszContainer必须设置为0。通常,当pszContainer为NULL时,会使用默认的密钥容器名称。例如,Microsoft Base Cryptographic Provider的用户当前使用其当前登录名作为关键字容器名登录。
PszProvider:指定的CSP提供程序的名称,它是以0结尾的字符串。如果该参数为空,则使用用户的默认供应商。
DwProvType:指定CSP提供程序的类型,值可以如下所示。
PROV_RSA_FULL PROV_SSL
证明_RSA_SIG证明_EC_ECDSA_SIG
PROV_DSS PROV_EC_ECNRA_SIG
PROV_DSS_DH PROV_EC_ECDSA_FULL
PROV _ forte zza PROV _ EC _ EC NRA _ FULL
PROV _ MS _ EXCHANGE PROV _ spy RUS _ LYNKS
PROV_RSA_SCHANNEL
其中,PROV_RSA_FULL表示提供者同时支持数字签名和数据加密,这是一个通用设置(其他具体含义请参考MSDN)。
DwFlags:标志值。该参数通常设置为零。但是,应用程序也可以设置以下标志中的至少一个:CRYPT_VERIFYCONTEXT、CRYPT_NEWKEYSET、CRYPT_MACHINE_KEYSET、CRYPT_DELETEKEYSET(具体含义见MSDN)。
返回值:如果函数调用成功,返回值非零(真);否则为0(假)。
调用CryptGenRandom()函数,将生成的随机数据填入缓冲区。
BOOL WINAPI CryptGenRandom(
HCRYPTPROV hProv,
DWORD dwLen,
字节* pbBuffer
);
参数描述:
HProv:是一个来自CSP(加密服务提供商)的句柄,通过调用CryptAcquireContext函数获得。
DwLen:缓冲区的大小。
PbBuffer:存储返回的随机数据的缓冲区。
返回值:
真实;如果呼叫成功;否则为假。
使用后释放句柄和关键字容器:CryptReleaseContext()。
调用CryptReleaseContext将释放一个CSP句柄;同时,每调用一次,引用计数将减1。当引用计数为零时,CSP上下文将被完全释放,并且不能再被其他应用程序使用。其定义如下:
BOOL WINAPI CryptReleaseContext(
HCRYPTPROV hProv,
DWORD双旗
);
参数描述:
HProv:待释放的CSP手柄
DwFlags:保留,通常设置为0。
返回值:如果调用成功,将返回非零值(TRUE)。