C++学习中的随机数问题

截止今天20点前,我一共完成了两个C++的实验,我觉得对于编程,有个最重要的原则,就是要多练习光学不
练是不会有进步的。以今天为例,本来觉得这两个实验应该是非常困难的,但是上手之后,遇到问题就解决问
题,没有拖延及时解决,提升编程能力,使我现在的感觉超级好,所以学习语言一定要多加练习才能有所收获,
才能有成就感。

随机数问题

C++中没有自带的random函数,要实现随机数的生成需要用到rand()srand()函数。

Rand()

单纯的rand()会返回一个0至RAND_MAX之间的随机数,而RAND_MAX的值与int的位数有关,最小是32767。
不过rand()是一次性的,因为系统默认的随机数种子为1,只要随机数种子不变,其生成的随机数数列就
不会变。

##Srand()
srand()可用来设置rand()产生随机数时的随机数种子。通过设置不同的种子,我们可以获取不同的随机
数序列。可以利用srand((unsigned int)(time(NULL))的方法,利用系统时钟,产生不同的随机数种子。
不过要调用time(),需要加入头文件< ctime >

1
2
3
4
5
6
7
8
9
10
11
#include<iostream>
#include<stdlib.h>
#include<ctime>
using namespace std;
int main()
{
int i;
srand((unsigned)time(NULL));
i=rand();
return 0;
}

通式

产生一定范围随机数的通用表示公式是:

  • 取得(0,x)的随机整数:rand()%x;
  • 取得(a,b)的随机整数:rand()%(b-a);
  • 取得[a,b)的随机整数:rand()%(b-a)+a;
  • 取得[a,b]的随机整数:rand()%(b-a+1)+a;
  • 取得(a,b]的随机整数:rand()%(b-a)+a+1;
  • 取得0-1之间的浮点数:rand()/double(RAND_MAX)。

编程过程中遇到的问题

我编写的程序中需要生成两个随机数,开始时我的代码是(我这是一个类中的两个函数)

1
2
3
4
5
6
7
8
9
10
11
12
int Dice::playdice1()
{
srand((unsigned)time(NULL));
dicenum= rand() % 6 + 1;
return dicenum;
}
int Dice::playdice2()
{
srand((unsigned)time(NULL));
dicenum = rand() % 6 + 1;
return dicenum;
}

但是这样的方式产生了一个问题,就是运行的结果是两个函数返回的结果值总是一样的,为了解决这个问题,
通过Baidu知道,只用将第二个函数中的srand((unsigned)time(NULL));去掉即可。原因是因为time
函数是以毫秒为单位返回时间的,而目前的CPU是很快的,在这个程序里两次time的调用间隔肯定是小于1毫
秒的,所以导致srand产生的种子一样。
一个线程里,srand用一次就行了,而不是每次rand都要srand。