Windows系统下快速生成随机数的技巧

在日常工作中,有很多场合需要用到随机数。做实验的时候,可能需要一些随机数进行测试;很多产品厂商需要给自己的产品分配随机序列号,或者给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)。

Windows系统下快速生成随机数的技巧

我们注意到上面的随机数是十进制的。那么,如果你想生成整数呢?有两种方式,一种是对生成的小数随机数进行四舍五入,另一种是直接生成整数随机数。

例如,第一个示例将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()函数更加形象,使用起来也更加简单。

Windows系统下快速生成随机数的技巧

如果你觉得用以上方式生成区间随机数比较麻烦,可以用第三方工具软件实现。比如使用随机数生成器,方便设置随机数区域,限制条件,从而自动生成符合条件的随机数。

软件运行后,在左上方的间隔后的两个框中输入由随机数生成的范围值,在小数点后的位数后输入截断的小数位数。

在要生成的位数后输入每次生成的随机数个数。之后,单击“生成整数”按钮生成指定数量的随机整数。

单击Generate decimal生成相应的随机小数(图3)。

Windows系统下快速生成随机数的技巧

在设置好生成随机数的条件后,也可以通过快捷键来完成创建随机数的操作。按功能键F1创建指定范围的整数,按F2生成指定范围的小数,按F4清除随机数列表。如果要产生大量的随机数,

要查找某个特定的随机数是否存在,可以使用Find按钮查找,找到后自动定位该随机数(图4)。如果想中途停止随机数的生成,可以按Esc。

Windows系统下快速生成随机数的技巧

提示:如果要生成不重复的随机数,请选中“下一个随机数不等于当前随机数”复选框。如果您想要复制生成的随机数或随机数列表,

使用软件窗口左下角的几个按钮进行操作。

2.特定格式的产品序列号的生成

作为产品厂商的工作人员,有两种方式可以为自己的软硬件产品安排序列号,或者让厂商为客户的VIP卡配置序列号。

首先,可以使用Excel的随机函数表达式。假设你要生成一个随机数序列号,形状为“123-456”,由两个三位数和连字符组成。

可以使用“=RANDBETWEEN(100,999) ' - ' RANDBETWEEN(100,999)”函数表达式。其中的“”符号连接前后结果,而“-”表示以指定连字符连接前后两段随机数。

可使用“=RANDBETWEEN(100000,999999) ' - ' RANDBETWEEN(100000,999999) ' - ' ' - ' RANDBETWEEN(100000,999999) ' - ' RANDBETWEEN(100000,999999) ' - ' RANDBETWEEN(100000,999999) ' - ' RANDBETWEEN(100000,999999)”函数表达式(图5)。

Windows系统下快速生成随机数的技巧

序列号的生成还可以使用第三方专用工具,如Portable Abluescarab Software CD-Key Generator软件。首次使用该软件弹出提示,需要进行参数配置,

配置参数主要有序列号的段数和每段的字符数两个参数(图6)。

Windows系统下快速生成随机数的技巧

进入序列号生成器的主窗口后,先通过下拉列表,在使用数字、字符、数字+字符3种方式中选择一种,再通过下面的复选框选择是否使用小写字母,然后点击Generate按钮,即可建立一组序列号(图7)。

Windows系统下快速生成随机数的技巧

小提示:虽然该软件为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)。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://www.freetrip88.com/baike/294188.html

      
上一篇 2023-09-19
相关推荐