随机数函数,求牛人、求思路、求代码。。。
要求是这样:
每次调用,都能生成2个到5个范围在1到30之间的正整数,并且随机生成的这些值不能相邻、不能相等。例如:生成的数字是:(2,2),违反规定;(1,2,3),违反规定; (1,3),违反规定;(1,4),没问题;(1,6,30,24,2),没问题。
我也不知道自己说清楚了没有,不过我是真心想请教各位编程达人这个问题的。还请各位千万千万要帮帮小弟。。。。
[解决办法]
bool equal(int a,int b)
{
return abs(a-b)<=1;
}
vector<int> randval(int min,int max =RAND_MAX ,int n=1)
{
if(max<=min || max-min>RAND_MAX || n<1 || max-min < 2*n-1)
{
return vector<int>();
}
vector<int> vec(n,min);
int len = max-min;
int total=0;
for(int i=0;i<n;i++)
{
int rad=rand()%len;
if(find(vec.begin(),vec.begin()+total,rad,equal)==vec.begin()+total)
{
i--;
}
else
{
vec[total++]+=rad;
}
}
return vec;
}
int main()
{
vector<int> v=randval(1,30,rand()%4+2);
copy(v.begin(),v.end(),ostream_iterator<int>(cout,"\t"));
}
[解决办法]
不知道你对时间复杂度有要求没
#include <iostream>#include <stdlib.h>#include <time.h>#include <MATH.H>using namespace std;int main() { int a[6]; int i; srand((unsigned)time(NULL));//取时间为种子 int j=rand()%4+2;//2-5个数 for(i=0;i<j;i++) { a[i]=rand()%31;//0-30之间的数 loop: for(int b=0;b<i;b++) while( (a[i]==a[b])||abs((a[i]-a[b]))==1)//如果一已生成的数相等或相邻则重新获取 { a[i]=rand()%31; goto loop;//重头再进行比较 } } for( i=0;i<j;i++) cout<<a[i]<<endl; }