C语言中随机数的简单总结

来源:互联网 发布:古典白话小说推荐知乎 编辑:程序博客网 时间:2024/05/16 18:23
#include <stdio.h>#include <stdlib.h>#include <time.h>#define MAXNUM 10#define MINNUM 1int main(void){    srand((unsigned int)time(0));    for ( int i = 0 ; i < 10 ; i ++ )    {        printf("%d\n", rand()%( MAXNUM - MINNUM + 1 ) + MINNUM );    }    return 0;}

  如果想生成每次启动程序不同的伪随机数,首先我们需要使用srand()进行“撒种”。srand()接受一个 unsigned int 型参数。而且,传进去的参数需要在每次程序启动时不同。一种比较广泛的做法是传入当前的时间。我们使用time()函数来获取日历时间。time()函数的原型为:

 

  time_t time (time_t* tp);

  “ time函数返回当前日历时间。如果无法获取日历时间,则返回值为-1。如果 tp 不为 NULL,则同时将返回值赋给 *tp。”《C程序设计语言 第二版》

  那 time_t 又是什么呢?我在 MinGW 4.8.1,32-bit Application,Windows 8.1 Update x64 环境下查看了定义:
 
  typedef __int64 __time64_t;   typedef __time64_t time_t;  
   哦,就是一个__int64啊。那还是转换一下类型的好啊。C语言里unsigned和signed之间的转换实在头疼。C++之父 Bjarne Stroustrup 在回应 Linus 对 C++ 批判的时候说道:

 
C isn't simple: Please explain the rules for conversion from unsigned short to int.我是explain不出来。

   再看看rand()。

  
函数rand()生成介于0和RAND_MAX之间的伪随机整数序列。 《C程序设计语言 第二版》
 
  之前在网上查到说如果想输出X~Y的随机数可使用如下方法:
 
  rand()%(Y-X+1)+X;
 

  道理我想是显而易见的。 
 

  MSDN (  http://msdn.microsoft.com/zh-cn/library/398ax69y.aspx )的示例中也给出一种需要double的方法。摘录代码如下:
 
int u = (double)rand() / (RAND_MAX + 1) * (range_max - range_min)  + range_min;printf( "  %6d\n", u);

 不过鉴于double计算比起int实在慢太多,所以不建议使用。

0 0
原创粉丝点击