1、用C语言产生随机数用 c 语言产生随机数在 C 语言中 ,rand() 函数可以用来产生随机数,但是这不是真 真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它 为种子,为基准以某个递推公式推算出来的一系数, 当这系列数很大 的时候,就符合正态公布, 从而相当于产生了随机数,但这不是真正 的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破 坏了系统,为了改变这个种子的值, C 提供了 srand() 函数,它的原 形是 void srand( int a) 。可能大家都知道 C 语言中的随机函数 random ,可是 random 函数 并不是 ANSI C 标准,所以说,
2、 random 函数不能在 gcc,vc 等编译 器下编译通过。rand() 会返回一随机数值, 范围在 0 至 RAND_MAX 间。返回 0 至 RAND_MAX 之间的随机数值, RAND_MAX 定义在 stdlib.h ,(其 值至少为 32767) ,运算的结果是一个不定的数,要看你定义的变量 类型, int 整形的话就是 32767 。 在调用此函数产生随机数前,必 须先利用 srand() 设好随机数种子,如果未设随机数种子, rand() 在调用时会自动设随机数种子为 1 。一般用 for 语句来设置种子的个 数。具体见下面的例子。一 如何产生不可预见的随机序列呢 利用 sr
3、and(unsigned 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 #include #include / 使用当前时钟做种子void main( void )int i;srand( (unsigned)time( NULL ) ); / 初始化随机数for( i = 0; i 10;i+ ) / 打印出 10 个随机数printf( %dn, rand() );根据上面的程序可以很容易得到 01 之间的随机数:#include #include #include
5、main( )int i;srand( (unsigned)time( NULL ) );for( i = 0; i 10;i+ )printf( %5.2fn, rand()/32767.0);而产生 1100 之间的随机数可以这样写:#include #include #include main( )int i;srand( (unsigned)time( NULL ) );for( i = 0; i 10;i+ )printf( %dn, rand()%100+1); 二,三个通用的随机数发生器,推荐用第三个 函数名 : rand功 能 : 随机数发生器 用 法 : void rand(
6、void);程序例:#include #include int main(void)int i;printf(Ten random numbers from 0 to 99nn);for(i=0; i10; i+)printf(%dn, rand() % 100);return 0;函数名 : random功 能 : 随机数发生器用 法 : int random(int num);程序例:#include #include #include /* prints a random number in the range 0 to 99 */ int main(void)randomize();%
7、dn,printf(Random number in the 0-99 range: random (100);return 0;函数名 : randomize 这个比较好! 功 能 : 初始化随机数发生器 用 法 : void randomize(void); 程序例:#include #include #include int main(void)int i;randomize();printf(Ten random numbers from 0 to 99nn); for(i=0; i10; i+)printf(%dn, rand() % 100);return 0;在计算机常用算法中有
8、介绍随机数的生成算法三 如何产生设定范围内的随机数由于 rand 产生的随机数从 0 到 rand_max ,而 rand_max 是一个 很大的数,那么如何产生从 XY 的数呢?从X到丫,有丫 X + 1个数,所以要产生从X到丫的数,只需 要这样写:k=ra nd()%( Y-X+1)+X;这样,就可以产生你想要的任何范围内的随机数了。 四,产生不重复的随机数1 ) #include #include #include#include swap(int *pm,int *pn) /* 必须用指针进行交换 */int temp;temp=*pm;*pm=*pn;*pn=temp;int mai
9、n(void) int i,a513;/*int *pa,*pb;*/srand( (unsigned)time( NULL ) ); /* 定义这个可以产生不同的随机数*/for(i=1; i=1; i-)/* pa=&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 #include #include
10、int main(void)int a100=0; int 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 () %44+16 (这里
11、 44 由 59-16+1 得到)。其他情况如 法炮制!面是搜回来的:问题 1: 怎样获得一个真正的随机数?要知道, rand() 是不能产生真正的随机数 的 !即使不能产生真正的随机数,也要大概接近呀!而 rand() 好象每次的随机都一样。专家解答 :之所以 rand() 每次的随机数都一样是因为 rand() 函数使用不正确。各种编 程语言返回的随机数 (确切地说是伪随机数) 实际上都是根据递推公式计算的一 组数值,当序列足够长, 这组数值近似满足均匀分布。 如果计算伪随机序列的初 始数值(称为种子)相同,则计算出来的伪随机序列就是完全相同的。这个特性 被有的软件利用于加密和解密。 加密
12、时,可以用某个种子数生成一个伪随机序列 并对数据进行处理; 解密时,再利用种子数生成一个伪随机序列并对加密数据进 行还原。这样,对于不知道种子数的人要想解密就需要多费些事了。当然,这种 完全相同的序列对于你来说是非常糟糕的。 要解决这个问题, 需要在每次产生随 机序列前, 先指定不同的种子, 这样计算出来的随机序列就不会完全相同了。 你 可以在调用 rand() 函数之前调用 srand( (unsigned)time( NULL ) ) ,这样以 time 函数值(即当前时间)作为种子数,因为两次调用 rand 函数的时间通常 是不同的,这样就可以保证随机性了。你也可以使用 srand 函数
13、来人为指定种 子数。Windows 9x/NT 的游戏FreeCell就允许用户指定种子数,这样用户如果一次游戏没有成功,下次还可以以同样的发牌结果再玩一次。问题2: 我按照上述方法并不能产生随机数, 仅产生公差为 3或4 的等差数列:#include #include #include #include void main()for(int i=0;i100000;i+)srand( (unsigned)time( NULL ) );coutrand()endl;专家解答:你的程序是有问题的,你每产生一个随机数之前,都调用一次 srand ,而由 于计算机运行很快,所以你每次用 time 得到的时间都是一样的( time 的时间 精度较低,只有 55ms )。这样相当于使用同一个种子产生随机序列,所以产生 的随机数总是相同的。你应该把 srand 放在循环外:srand( (unsigned)time( NULL ) );for(int i=0;i100000;i+)相关语句感谢下载!欢迎您的下载,资料仅供参考
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1