算法学习(三)Java/C++分别实现生成随机数 之二

算法学习(二)由于太长了所以我就把它分成两部分了!
大家可以根据不同的链接选择不同的语言哦!
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++中随机数的理解!欢迎大家评论区进行指导!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值