C++随机数生成

 一.随机数应用原理:计算机的随机数都是伪随机数生成序列,由小M多项式序列生成的,其中产生每个小序列都从一个初始值开始,即随机种子。

     (注意: 小M多项式序列周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后又会重复出现。)

      利用rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是根据一个数(我们可以称它为种子)为基准以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统。

二.随机数数学原理:rand()的内部实现是利用数学线性同余法,需要可自行查找。

三.随机数范围:rand()返回随机数值的范围在0至RAND_MAX 间。RAND_MAX的范围最少是在32767之间(int)。用unsigned int 双字节是65535,四字节是4294967295的整数范围。0~RAND_MAX每个数字被选中的机率是相同的。

四.随机数关键函数介绍:

rand()函数:

1.语言:C++操作

2.功能:随机数发生器

3.头文件: stdlib.h

4.使用事例:

产生0—100随机数    a = (int) ( rand() % 100 )

产生20—100随机数   a = (int) ( rand() % 80)+20

注:int 可换成double ,float型,相应数据也更换即可。

5.随机数重复问题 划重点(敲黑板)

以上事例未设定随机数种子,系统默认的随机数种子为1,rand()产生的是伪随机数字,每次执行时是相同的。若需要每次执行随机数不同,用种子函数srand()初始化。

srand()函数:

1.功能:初始化随机数发生器

2.用法: void srand(unsigned int seed)

3.头文件: stdlib.h

srand()用来设置rand()产生随机数时的随机数种子。

参数seed必须是个整数,如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。

4.习惯用法:使用当前系统时钟作为随机数种子:(需要调用头文件time.h)

                 srand((unsigned int)(time(NULL))

   注意:若需要多轮生成一组随机数,每一轮的时间小于一秒,就会导致生成相同随机数序列,因为系统时间精确到秒。

   经尝试,可将随机数种子设为动态整形变量,见下面例子。

五.随机数生成事例:

1.生成10*10随机数,10轮,利用系统时间做随机数种子

#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;

int main()
{
    void randomExponential( );
   int    i ;
   for(i=0; i<10; i++)
   {
     srand((int)time(NULL));
     random( );
   }
     return 0;
}
void random( )
{
     int    i,j,a[10][10] ;
   for(i=0; i<10; i++)
    {
        for(j=0; j<10; j++)
     {
       a[i][j] = (int) ( rand() % 100 ) ;
        while(  a[i][j] == 0 )
        {
             a[i][j] = (float) ( rand() % 100 );
        }
     }
         cout<<a[i][0]<<'\t'<<a[i][1]<<'\t'<<a[i][2]<<'\t'<<a[i][3]<<'\t'<<a[i][4]<<'\t'<<a[i][5]<<'\t'<<a[i][6]<<'\t'<<a[i][7]<<'\t'<<a[i][8]<<'\t'<<a[i][9] << endl;
    }
    cout<<"**********************" << endl;
    return;
}

运行结果:运行时间 0.023s

1.生成10*10随机数,10轮,利用动态变量做随机数种子

#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int main()
{
    void randomExponential( );
   int    i ;
   for(i=0; i<10; i++)
   {
     srand(i);
     randomExponential( );
   }
     return 0;
}
void randomExponential( )
{
     int    i,j,a[10][10] ;
   for(i=0; i<10; i++)
    {
        for(j=0; j<10; j++)
     {
       a[i][j] = (int) ( rand() % 100 ) ;
        while(  a[i][j] == 0 )
        {
             a[i][j] = (float) ( rand() % 100 );
        }
     }
         cout<<a[i][0]<<'\t'<<a[i][1]<<'\t'<<a[i][2]<<'\t'<<a[i][3]<<'\t'<<a[i][4]<<'\t'<<a[i][5]<<'\t'<<a[i][6]<<'\t'<<a[i][7]<<'\t'<<a[i][8]<<'\t'<<a[i][9] << endl;
    }
    cout<<"*******************************************************" << endl;
    return;
}

运行结果:运行时间 0.019s


注:此文章为本人做项目时涉及到,留作记录,欢迎批评指正。

 部分内容摘抄自http://www.cnblogs.com/afarmer/archive/2011/05/01/2033715.html。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值