随机数的产生方法

本文介绍了在C++中如何使用rand()函数生成随机数,以及解决每次调用产生相同序列的问题。通过srand()函数结合time(0)可以确保每次运行程序时生成不同的随机数。同时,讲解了time_ttime(0)函数的作用,即返回从1970年至今的秒数,用于设置rand()的种子。通过调整rand()的取模运算,可以生成指定范围内的随机数。
摘要由CSDN通过智能技术生成

基础知识:在c++中要产生随机数的时候可以使用使用随机数产生函数 int  rand(void);

本函数产生一个从0到0x7fff(32767)之间的值;

每次调用rand()产生的数列是相同的;是伪随机数;例如

include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
unsigned int a;
for(int i=0;i<20;i++)
{
a=rand();
cout<<a<<endl;
}

	return 0;
}

这段程序无论何时调用产生的20个数组成的数列是一样的;

为了解决这个问题,在每次调用rand()之前先调用一次srand(int x)函数,这样rand()产生的随机数在x和32767之间;

但是,如果下次调用rand()函数之前不改变x的值产生的依然是一系列的伪随机数,尤其在循环的时候;这样有必要在每次调用srand(int x)的时候设置不同的x值;

聪明的程序员想到了利用计算机里的time函数来获得一个几乎随时变动的值;

这个x值就是种子数,随时让计算机产生;

函数:void srand(unsigned seed);
参数seed是rand()的种子,用来初始化rand()的起始值。

每次调用rand()函数前分两种情况

1) 如果用户在此之前调用过srand(seed),给seed指定了一个值,那么调用rand()时它会自动使用上次的值

2) 如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。把种子数设定为1;

所以根据上面的情况我们就可以得出:
1) 如果希望rand()在每次程序运行时产生的值都不一样,必须给srand(seed)中的seed一个新值,这个值必须在每次程序运行时都不一样(比如从1970年到目前为止流逝的时间)。

下面说说time;

关于time_t time(0):要调用这个函数必须包括头文件<time.h>。time_t 被定义成了long;

它返回从1970年1月1日零时零分零秒到目前为止所经过的时间,单位为秒。

这样在每次生成随机数之前先调用srand((unsigned)time(0));就设置了seed的值;

你马上就会说这个数比32767大,是的,它在机器内部溢出了,只利用最后的有效数字;

以下就是源码;

#include <ctime>
int rand_num;
srand((unsigned)time(0));
for(int i=0;i<10;i++){ 
  rand_num=rand() ;
  cout<<rand_num<<" ";
}

这样产生的随机数你可以随便利用了。例如你要产生从a到b之间的随机数可以用

(rand_num%  (b-a))+ a 来求;此处含a,不含b;要含b,在取余时(b-a+1)即可;

要产生0到9之间的随机数含0,含9;用rand_num%10;就行;

产生11到15之间的随机数,含11,含15,用rand_num%5+11就行,以此类推;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值