C++随机数

目标

 产生一个介于[a, b]的随机整数。

工具

rand()

1
2
#include "cstdlib" // rand()和srand()都包含在此文件中
int rand(void); // 调用格式

 rand()函数用于产生一个随机数,数值介于[seed, RAND_MAX]之间。其中,seed由srand()来提供,而RAND_MAX为定义在头文件“cstdlib”中的一个常量,其数值为0x7fff = 32767。

srand()

1
srand(seed); // 调用格式

  srand()函数为rand()提供seed,在使用时放置于rand()前。如果srand()提供的seed可以动态变化,那么rand()生成的随机数也会动态变化,否则多次编译时,rand()会一直返回一个相同的随机数。实际中常常使用time()函数来实现这个动态变化。要注意的是,在循环产生随机数时,应该将srand()语句放在循环体外,否则由于循环语句执行很快可能导致time()值未刷新,无法实现动态变化的要求。

time()

1
2
#include "ctime"
int t = (int)time(NULL); // time(0)和time(NULL)用法一样

 time()函数返回从1970/1/1,00:00:00到当前系统时间所差的秒钟数。显然这个数字是不断变化的。但是仍要注意,如果在多次编译中要求随机数种子seed变化的时间小于1s则不能使用此法。

实现

 1.记得在头文件中包含“cstdlib”和“ctime”两个文件。

 2.调用srand(),以time()返回值作为参数。这里注意time()的返回值其实时一个time_t型数据,而time_t为长整型。我们可以通过显式强制类型转换将其转化为所需要的数据类型。

 3.调用rand()生成一个随机整数。

 4.根据要求对得到的整数进行处理。比如要得到某个区间中的随机数,就将得到的大数x在指定区间上进行分配,算法为:“x % 区间长度 + 区间左端点”。还可以利用得到的大数来实现随机浮点数。

返回[a, b]区间中一个任意值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "iostream"
#include "cstdlib"
#include "ctime"
using namespace std;

int random(int a, int b){
srand((unsigned int)time(0));
if(a > b){
int tmp = a;
a = b;
b = tmp;
}
return rand() % (b-a+1) + a;
}

int main(int argc, char const *argv[])
{
int a, b;
cin >> a >> b;
cout << random(a, b);
return 0;
}


转载请注明来源:©Tinshine