算法学习(二)由于太长了所以我就把它分成两部分了!
大家可以根据不同的链接选择不同的语言哦!
Java实现
C++实现
C++实现
在参考链接1中得知,计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子。(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了。)
我们都知道rand()函数可以产生随机数,但其实所产生的并不是真正意义上的随机数,而是一个伪随机数(伪随机数在我的blog算法学习(二)中有介绍),它是根据一个数(随机种子)为基准以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态分布,从而相当于产生了随机数,但这并不是真正的随机数,当计算机开始后,这个种子的值就已经定了,除非破坏了系统!
1.rand()
- 功能:随机数发生器
- 用法:int rand(void)
- 所在头文件:stdlib.h(c++中可用cstdlib)
rand()返回的随机数值范围在 [0, RAND_MAX]之间,RAND_MAX详细信息请参考链接1。
用户为设定随机种子时,系统默认的随机种子为 1。因此 rand()产生的是伪随机数,每次执行时都是相同的,若要不相同,可以用函数 srand()初始化它。
2.srand()
- 功能:初始化随机数发生器
- 用法:void srand(unsigner int seed)
- 所在头文件:stdlib.h(c++中可用cstdlib)
srand()用来设置 rand()的随机种子。参数seed必须是个整数。
srand(unsigned int seed); // 如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。
在vs中C++自带 rand()和 srand()函数,在dev中要导入包(#include )
3.使用当前时钟作为随机数种子
rand()产生随机数在每次运行时都是与上一次相同的。若要不同,用函数 srand()初始化它。利用 srand((unsigner int)(time(NULL))的方法,产生不同的随机种子,因为每次运行程序的时间是不同的。此时需要引入头文件 time.h。
代码
#include <iostream>
#include <cstdlib> // rand()和 srand()
#include <time.h> // time 也可用<ctime>
using namespace std;
int main()
{
cout <<"RAND_MAX:"<< RAND_MAX << endl;
srand((unsigned)time(NULL));
for (int i = 0; i < 5; i++)
cout << rand() << endl;
}
指定范围产生随机数
我们可先使用 rand()函数产生一个[0, RAND_MAX]范围内产生随机数,然后变换到指定范围内。
产生 [a, b)的随机整数,可使用 (rand() % (b-a))+a;
产生 [a, b]的随机整数,可使用 (rand() % (b-a+1))+a;
产生 (a, b]的随机整数,可使用(rand() % (b-a))+a+1;
产生 (a, b)的随机整数, 可使用 (rand() % (b-a-1))+a;(此时应满足(b-a)>1);
- 通用公式: a + rand()%n
- 其中:a为范围起始位置,n为整数的范围;
产生[a, b]的随机数,可使用 a+(b-a)*rand()/RAND_MAX;
产生[0, 1]的浮点数,可使用rand()/(double)RAND_MAX;
产生浮点数还可以用,rand()%100/100
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
srand(time(0)); // time(0)与time(NULL)等价,返回的是系统时间(从1970.1.1午夜算起),单位:秒
for(int i = 0; i<10 ;i++)
cout<<rand()%10<<endl;
system("pause");
return 0;
}
参考链接1:https://www.cnblogs.com/afarmer/archive/2011/05/01/2033715.html
参考链接2:https://blog.csdn.net/YF_Li123/article/details/75220786
参考链接3:https://blog.csdn.net/qsyzb/article/details/12653005
这篇是我对C++中随机数的理解!欢迎大家评论区进行指导!