随机数值域拓宽

已有方法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;
}

 试一下

 

 

posted @ 2020-07-06 18:40  C_hp  阅读(156)  评论(0编辑  收藏  举报