随机数函数,伪随机数产生,种子值,时间函数time()

随机数函数

c程序库中提供了rand函数来随机产生随机数。事实上,rand()是一个“伪随机数发生器”,这意味着可以预测数字的实际顺序,但这些数字在可能的取值范围内均匀的分布。
下面的程序给出了随机数函数运行的过程,这一方案始于一个称为“种子”的数字。函数使用这个种子来产生一个新书,而这个新数又称为新的种子,接着,这个新种子被用来产生一个更新的种子,依次类推。这时需要一个静态变量来记录种子。

//rand0.cpp--产生随机数
static unsigned long int next = 1;//种子
int rand0()
{
//产生伪随机数的公式;
next=next*1103515245+12345;//超过范围会自动舍弃高位,例如无符号短整型范围是0-65535,如果输入为65536,则会输出0;
return(unsigned int)(next/65536)%32768;
}

上面的程序是产生一个0到32767之间的随机整数。
下面用另外一个程序测试一下rand0;

//rdrive0.cpp,测试rand0函数
#include<iostream>
using namespace std;
int rand0();
int main()
{
int count;
for(count=0;count<5;count++)
cout<<rand0()<<endl;
return 0;

输出为:
16838
5758
10113
17515
31051
再运行一次,输出还是:
16838
5758
10113
17515
31051
如果将种子值从1改为2,则输出为:
908
22817
10239
12914
25837
这就是为什么说计算机产生的随机数都是“伪随机”了,因为随机数的产生完全由种子值和产生随机数的公式产生。因此为了产生不同的随机数序列,一般需要对种子值进行重置。下面的代码是修改后的具有重置种子功能的代码。

//rand1.cpp--产生随机数
static unsigned long int next = 1;//种子
int rand1()
{
//产生伪随机数的公式;
next=next*1103515245+12345;
return(unsigned int)(next/65536)%32768;
}

void srand1(ubsigned int seed)
{
next=seed;
}
//rdrive1.cpp,测试rand0函数
#include<iostream>
using namespace std;
int rand0();
int main()
{
int count;
unsigned seed;
cin>>seed;//输入种子;
srand1(seed);//设置种子;
for(count=0;count<5;count++)
cout<<rand0()<<endl;
return 0;

上面的程序比之前的两个多了设置种子的过程,这样不同的种子产生的随机数序列也将不同。
上面主要介绍了随机数产生的机理以及种子的作用,实际中一般使用系统时间进行种子重置。
c中有一个函数time()可以返回系统时间,具体值为格林尼治时间1970年1月1日00:00:00到当前时刻的时长,时长单位是秒。使用time()函数必须包含头文件<time.h>。使用系统函数rand()和srand()生成随机数的步骤如下:
1)首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;
2)然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)
3)根据需要多次调用rand(),从而不间断地得到新的随机数;
4)无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。
下面是0~32767之间的随机数程序:

#include <stdlib.h>
#include <stdio.h>           //rand()和srand()函数需要头文件<stdio.h>
#include <time.h>           //使用当前时钟做种子
 
void main( void )
{int i;
srand( (unsigned)time( NULL ) );          //初始化随机数
     for( i = 0; i < 10;i++ )                          //打印出10个随机数
          printf( " %d\n", rand() );
}

根据上面的程序可以很容易得到0~1之间的随机数:

#include <stdlib.h>
#include <stdio.h>
#include <time.h> 
main( )
{int i;
srand( (unsigned)time( NULL ) );  
       for( i = 0; i < 10;i++ )
            printf( "%5.2f\n", rand()/32767.0);
}
而产生1~100之间的随机数可以这样写:
#include <stdlib.h>
#include <stdio.h>
#include <time.h> 
main( )
{int i;
srand( (unsigned)time( NULL ) );  
       for( i = 0; i < 10;i++ )
            printf( "%d\n", rand()%100+1);
}

使用time()和ctime()(将时间和日期以字符串格式表示) 返回当前时间:


#include <stdio.h>
#include <time.h>
 
int main(void)
{
    time_t timeValue = 0;
    char *str = NULL;
 
    timeValue = time(NULL);
    str = ctime(&timeValue);
    printf("时间字符串 = %s\n",str);
 
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值