读书人

随机数函数求牛人、求思路、求代码。

发布时间: 2012-05-01 12:48:58 作者: rapoo

随机数函数,求牛人、求思路、求代码。。。
要求是这样:
每次调用,都能生成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"));
}
[解决办法]
不知道你对时间复杂度有要求没

C/C++ code
#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;    } 

读书人网 >C++

热点推荐