随机数值域拓宽
已有方法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;
}
试一下
不积小流无以成江河