用C语言产生随机数_第1页
用C语言产生随机数_第2页
用C语言产生随机数_第3页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、用 c 语言产生随机数在 C 语言中 ,rand() 函数可以用来产生随机数,但是这不是真 真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它 为种子,为基准以某个递推公式推算出来的一系数, 当这系列数很大 的时候,就符合正态公布, 从而相当于产生了随机数,但这不是真正 的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破 坏了系统,为了改变这个种子的值, C 提供了 srand() 函数,它的原 形是 void srand( int a) 。可能大家都知道 C 语言中的随机函数 random ,可是 random 函数 并不是 ANSI C 标准,所以说, random 函

2、数不能在 gcc,vc 等编译 器下编译通过。rand() 会返回一随机数值, 范围在 0 至 RAND_MAX 间。返回 0 至 RAND_MAX 之间的随机数值, RAND_MAX 定义在 stdlib.h ,(其 值至少为 32767) ,运算的结果是一个不定的数,要看你定义的变量 类型, int 整形的话就是 32767 。 在调用此函数产生随机数前,必 须先利用 srand() 设好随机数种子,如果未设随机数种子, rand() 在调用时会自动设随机数种子为 1 。一般用 for 语句来设置种子的个 数。具体见下面的例子。一 如何产生不可预见的随机序列呢 利用 srand(unsig

3、ned int)(time(NULL)是一种方法, 因为每一次运行程序的时间是不同的。在 C 语言里所提供的随机数发生器的用法: 现在的 C 编译器 都提供了一个基于 ANSI 标准的伪随机数发生器函数, 用来生成随机 数。它们就是 rand() 和 srand() 函数。这二个函数的工作过程如下:1) 首先给 srand() 提供一个种子, 它是一个 unsigned int 类型,其 取值范围从 065535 ;2) 然后调用 rand() ,它会根据提供给 srand() 的种子值返回一个随 机数 (在 0 到 32767 之间 )3) 根据需要多次调用 rand() ,从而不间断地得到

4、新的随机数;4) 无论什么时候,都可以给 srand() 提供一个新的种子,从而进一 步“随机化” rand() 的输出结果。下面是 032767 之间的随机数程序:#include <stdlib.h>#include <stdio.h>#include <time.h>/ 使用当前时钟做种子void main( void )int i;srand( (unsigned)time( NULL ) );/ 初始化随机数for( i = 0; i < 10;i+ )/ 打印出 10 个随机数printf( " %dn", rand()

5、 );根据上面的程序可以很容易得到 01 之间的随机数:#include <stdlib.h>#include <stdio.h>#include <time.h> main( )int i;srand( (unsigned)time( NULL ) );for( i = 0; i < 10;i+ )printf( "%5.2fn", rand()/32767.0);而产生 1100 之间的随机数可以这样写:#include <stdlib.h>#include <stdio.h>#include <t

6、ime.h> main( )int i;srand( (unsigned)time( NULL ) );for( i = 0; i < 10;i+ )printf( "%dn", rand()%100+1); 二,三个通用的随机数发生器,推荐用第三个 函数名 : rand功 能 : 随机数发生器 用 法 : void rand(void);程序例:#include <stdlib.h>#include <stdio.h>int main(void)int i;printf("Ten random numbers from 0 t

7、o 99nn");for(i=0; i<10; i+)printf("%dn", rand() % 100);return 0;函数名 : random功 能 : 随机数发生器用 法 : int random(int num);程序例:#include <stdlib.h>#include <stdio.h>#include <time.h>/* prints a random number in the range 0 to 99 */ int main(void)randomize();%dn",printf

8、("Random number in the 0-99 range: random (100);return 0;函数名 : randomize这个比较好! 功 能 : 初始化随机数发生器 用 法 : void randomize(void); 程序例:#include <stdlib.h> #include <stdio.h> #include <time.h>int main(void)int i;randomize();printf("Ten random numbers from 0 to 99nn"); for(i=0

9、; i<10; i+)printf("%dn", rand() % 100);return 0;在计算机常用算法中有介绍随机数的生成算法三 如何产生设定范围内的随机数由于 rand 产生的随机数从 0 到 rand_max ,而 rand_max 是一个 很大的数,那么如何产生从 XY 的数呢?从X到丫,有丫 X + 1个数,所以要产生从X到丫的数,只需 要这样写:k=ra nd()%( Y-X+1)+X;这样,就可以产生你想要的任何范围内的随机数了。 四,产生不重复的随机数1 ) #include <stdlib.h>#include <stdio

10、.h>#include<stdio.h>#include <time.h>swap(int *pm,int *pn)/* 必须用指针进行交换 */int temp;temp=*pm;*pm=*pn;*pn=temp;int main(void) int i,a513;/*int *pa,*pb;*/srand( (unsigned)time( NULL ) ); /*定义这个可以产生不同的随机数*/for(i=1;i<=512;i+)ai=i;printf("%4d",ai);for(i=512;i>=1;i-)/* pa=&

11、;ai; pb=&arand()%i+1;*/swap(&ai, &arand()%i+1);/* 加一是从一到 i 的随机,就不会包含 0*/* 不用再定义指针,这样结论是一样的 */printf("n") ;for(i=1;i<=64; i+)printf("%4d",ai );getch();/*wintc 的输出 */2)#include <stdlib.h>#include <stdio.h>#include<stdio.h>int main(void)int a100=0;in

12、t i,m;for(i=1; i<=99; +i) printf("%4d",ai );srand( (unsigned)time( NULL ) ); or(i=1; i<=99; i+)while(am=rand()%100+1); am = i;for(i=1; i<=99; +i) printf("%4d",ai );getch();srand ( int )time (NULL );设定随机数种子rand()%100 ;产生 0-99 的随机数。高级点的,假如要产生 16-59 之间的数, 你可以这样写: rand () %4

13、4+16 (这里 44 由 59-16+1 得到)。其他情况如 法炮制!面是搜回来的:问题 1: 怎样获得一个真正的随机数?要知道, rand() 是不能产生真正的随机数 的 !即使不能产生真正的随机数,也要大概接近呀!而rand() 好象每次的随机都一样。专家解答 :之所以 rand() 每次的随机数都一样是因为 rand() 函数使用不正确。各种编 程语言返回的随机数 (确切地说是伪随机数) 实际上都是根据递推公式计算的一 组数值,当序列足够长, 这组数值近似满足均匀分布。 如果计算伪随机序列的初 始数值(称为种子)相同,则计算出来的伪随机序列就是完全相同的。这个特性 被有的软件利用于加密

14、和解密。 加密时,可以用某个种子数生成一个伪随机序列 并对数据进行处理; 解密时,再利用种子数生成一个伪随机序列并对加密数据进 行还原。这样,对于不知道种子数的人要想解密就需要多费些事了。当然,这种 完全相同的序列对于你来说是非常糟糕的。 要解决这个问题, 需要在每次产生随 机序列前, 先指定不同的种子, 这样计算出来的随机序列就不会完全相同了。 你 可以在调用 rand() 函数之前调用 srand( (unsigned)time( NULL ) ) ,这样以 time 函数值(即当前时间)作为种子数,因为两次调用 rand 函数的时间通常 是不同的,这样就可以保证随机性了。你也可以使用 s

15、rand 函数来人为指定种 子数。Windows 9x/NT的游戏FreeCell就允许用户指定种子数,这样用户如果一次游戏没有成功,下次还可以以同样的发牌结果再玩一次。问题2: 我按照上述方法并不能产生随机数, 仅产生公差为 3或4 的等差数列:#include <stdlib.h>#include <iostream.h>#include <conio.h>#include <time.h>void main()for(int i=0;i<100000;i+)srand( (unsigned)time( NULL ) );cout<<rand()<<

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论