随机数

本文探讨了C语言中生成随机数的方法,包括使用rand()函数及其局限性,并介绍了通过结合srand()函数和time()函数来提高随机数的质量。此外,还讨论了随机数序列的观察结果及改进思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这两天写的一个程序里需要用到随机数,就又 把随机数好好的看了一下,但终没找到我满意的。估计是没有吧。先把我看的东西总结一下。若大家有更好的,请留言回复教教俺哈,在此先谢谢了。

1 首先一提到随即数,大家肯定首先会想到 rand() ,也确实是这样, rand() 函数可以产生随机数。但是若是我们仅仅用 rand() 的话,就会发现,它产生的并不是真正的随机数。而是被人成为 的“伪随机数”,为什么这样说呢?大家看一下这个程序就明白了:

Code:
  1. #include <stdio.h>   
  2.   
  3. #include <stdlib.h> //rand() 需要它;   
  4.   
  5. int  main()    
  6.   
  7. {    
  8.   
  9. int  i;    
  10.   
  11. printf( "Ten random numbers from 0 to 99/n/n" );    
  12.   
  13. for (i=0; i<10; i++)    
  14.   
  15. printf( "%d/n" , rand()%100);    
  16.   
  17. return  0;    
  18.   
  19. }   

 

 

运行程序后,你会得到十个随机数, 也许这十个各不相同。这是因为他们都是在随即情况下产生的。但是当你再次运行或是多次运行后,你就会发现,每次运行后的结果都和第一次是一样的。这就是结 论了。仅由rand() 产生的随机数除了第一次是随机的外,其他时候都和第一次是一样的。因为他们 的种子是一样的。那我们如何产生真正的随机数呢?即每次得到的数字都是不一样的。我在网上查到了一个方法。如下。

2 srand() 函 数。

这个函数和以为 rand() 函数提供可变的种子。然后, rand() 函数就会产生出不断变化的随机数了。我们看下下面程序 :

 

 

Code:
  1. #include <stdio.h>   
  2.   
  3. #include <stdlib.h>    
  4.   
  5. #include <time.h>//time_t 需要它   
  6.   
  7. int  main()    
  8.   
  9. {    
  10.   
  11. int  i;    
  12.   
  13. time_t  t;   
  14.   
  15. srand((unsigned)time(&t));   
  16.   
  17. printf( "Ten random numbers from 0 to 99/n/n" );    
  18.   
  19. for (i=0; i<10; i++)    
  20.   
  21. printf( "%d/n" , rand()%100);    
  22.   
  23. return  0;    
  24.   
  25. }   

运行下程 序,哇,我们可以得到随机数了。。呵呵。。

还有人不是这样用,它没有为srand() 函数定义参数t. 他直接写成这样了:

Code:
  1. srand((unsigned)time(NULL));  

 

测试后我感觉这两个用法产生的效果没什么不同。

但是我总的感觉产生的随机数还是不够随机。因为我观 察发现,随机数大部分情况下都是升序变化的。并不是我们想象中的那样很随机。

3 random() randomize()

  好多人都提到这两个函数,但是我去查了这两个函数在C 语言中并不能运行成 功。在MSDN 上提到的Math.random() 产 生一个01 的伪随机数。但是好像是用到 Jscript 里的。 MSDN 提到了 Randomize [number ]; 好像是用到 VB 里面的。 C 语言里 好像没有这样的库函数。看了一个朋友的博客总结,他为了使用 randomize() 函数,竟然 写成这样 :

Code:
  1. #include <stdlib.h>   
  2.   
  3. #include <stdio.h>   
  4.   
  5. #include <time.h>   
  6.   
  7. #define randomize() srand((unsigned)time(NULL))   
  8.   
  9. int  main( void )   
  10.   
  11. {   
  12.   
  13.      int  i;   
  14.   
  15.     randomize();   
  16.   
  17.      for (i=0; i<10; ++i)   
  18.   
  19.     printf( "%d/n" , rand()%100);   
  20.   
  21. }   
  22.   

呵呵。真是执着和煞费苦心啊。。

若那位朋友有关于随机数的更好的方法不妨指教一下。 在此先谢谢了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值