如何自动生成随机数,生成随机数的方法有哪些

  如何自动生成随机数,生成随机数的方法有哪些

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

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: