随机数值域拓宽

Posted area-h-p

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了随机数值域拓宽相关的知识,希望对你有一定的参考价值。

已有方法rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10生成 1 到 10 范围内的均匀随机整数。

不可使用系统的Math.random()方法

样例 1:

输入:1
输出:[7]

样例 2:

输入:2
输出:[8,4]

样例 3:

输入:3
输出:[8,1,10]


思路为使产生随机数函数的值域覆盖1到10,且各个数值一定要等概

①rand7/2  产生0到3随机数,-rand7/2  产生-3到0随机数。


②(-rand7/2) 剔除-3和-2  产生0和-1随机数

③2*rand7  产生2到14随机偶数,2*rand7 + ②  产生1到14随机

④将③产生的随机数剔除大于10的部分即为所求

代码如下

#include<iostream>
#include<stdlib.h>//包含rand()的库
using namespace std;
class Rand_7
{
	public:
		int rand_7()
		{
			return 1+rand()%10;
		}
};

class Rand_10
{
	public:
		int rand_10()
		{

			Rand_7 ra;
			int lo = -2;
			while(lo < -1)
				lo = -ra.rand_7()/2;//产生0或-1的随机数

			int res = 2*ra.rand_7()+lo;//将2*ra.rand()_7()的值域拓宽至1到14的所有整数
			while(res > 10)//剔除大于10的部分
				res = 2*ra.rand_7()+lo;
			return res;

		}
};


int main()
{
	Rand_10 ra;
	int a = 0;
	cout<<"please input number:";
	cin>>a;
	cout<<"[";
	for(int i=0; i<a-1; ++i)
		cout<<ra.rand_10()<<",";
	cout<<ra.rand_10()<<"]"<<endl;
	return 0;
}

 试一下

技术图片

 

 

以上是关于随机数值域拓宽的主要内容,如果未能解决你的问题,请参考以下文章

2020牛客寒假算法基础集训营3——E.牛牛的随机数数位DP(待补)

阿里开发者们的第14个感悟:技术拓宽价值边界

21个常用代码片段

PHP 代码片段

java获取随机时间的源码片段

正在渲染opengl的随机屏幕片段-这表明啥错误?