rand随机函数和srand初始化种子函数

先看一份产生真随机函数的代码

#include 
#include 
// srand() 和 rand() 函数包含在此头文件中
#include 
// 由于要产生“真随机数列”,因此要用time()函数返回值来做“随机种子”

#define MAX 100000

int main ( ) {
   int a;
   freopen( "mytest.txt", "w", stdout );    // 把生成的数据写入文件mytest.txt,然后在解题的代码中加入freopen( "mytest.txt", "r", stdin ); ,使得代码从这个文本文件读取测试数据,代替手工从键盘输入数据。
   srand( (unsigned)time( NULL ) );
   int count = MAX;  // 生成的元素的个数
   // count = rand() % 10000;  生成一万以内的随机个元素
   printf ( "%d\n", count );
   // 下面的循环产生每个元素
   for ( int i = 0; i< count; i++ ) {
       a = rand() % 1000 ;   // 此时 0 <= a < 1000,全部是正整数
       if( a % 3 == 0 )  // 取三分之一的元素为负数,这个比例可以自己调整
           printf( "%d " -a );
       else
           printf( "%d ", a );
       }
   printf( "%d\n", count );  // 非0元素的个数。

   return 0;
 }

看了上面随机数产生的实现过程,无非就是srand()和rand()函数。

其实随机函数rand()是一个可以生成随机数的函数随机数,函数返回的随机数在0-RAND_MAX(32767)之间;【来自百度提问】
rand()%100结果是随机数除以100后所得的余数,即限定随机的范围是在0~99之间;

需要注意的是rand()函数产生的所谓随机数是需要种子(理解为参考,有不同的参考才能产生不同的数)的,srand()正是提供初始化种子的函数,我们要真正的随机函数,就要确保种子每次都是不同的,那么我们把每时每刻都在变化的电脑时间作为种子的话,那么就能通过不断变化的种子来得到不同的函数。如何实现呢?->srand( (unsigned)time( NULL ) );( 由于要产生“真随机数列”,因此要用time()函数返回值来做“随机种子”)

补充;
如果你要获得100以内的随机数,就对100求余,对10求余就是产生10以内的随机数,因为对一个数x求余后得到的数都是小于x的。

再贴一段百度提问的:
但如果对数有要求,如小数或在一定值以内:
小数:rand()/100.0 //100.0后面的.0必须写,得到一个小数点后有两位小数的小数。
一定范围内的数:rand()%m+n //m是数据区间差,n是最小值
如:求[ 100,120)之间的数就是:rand()%20+100

要产生0~100之间的 浮点型随机数:(rand()%1000)/10.0。

你可能感兴趣的:(杂文,C/C++)