最初利用数组
#include<iostream>
#include<iomanip>
#include<string>
#include<algorithm>
#include<ctime>
using namespace std;
int n,k,x;
int main(){
cin>>n;
while(n--){
cin>>k;
cin>>x;
int arr[k];
srand((unsigned)time(NULL));//时间做随机种子;
for(int i=1;i<=k;i++){
arr[i]=(rand()%k+1);//1~k
cout<<"随机生成的"<<k<<"个数为:";//会重复
cout<<arr[i]<<endl;
}
}
return 0;
}
变换思想
从运行的结果来看,我们发现产生了相同的数字,如果我们想要避免这种情况,即产生的随机数不会重复,那么该如何进行代码的编写?
最初的思想是每生成一个随机数,便于前面的所有随机数进行比较,如果有重复,则舍去不要,重新选取。但该方法十分费时,并且在数据量巨大的并且有一定限制的时候,会引发巨大问题。例如要生成10000个随机数,范围是0-9999,且不能重复,那么最后几个随机数有可能需要相当长的时间才能筛选出来。
下面我们从另外一个角度来思考,假设我们已经由一个数组长度为10000的数组,里面分别存储了数据0-9999,我现在的做法是想办法让10000个数进行随机排列,便得到了这样一个随机数列,如果我只要其中的100个数,那么从前面取出100个就好。这里利用algorithm.h里面的一个函数,,来进行简单处理。
template<class RandomAccessIterator>
void random_shuffle(
RandomAccessIterator _First,
RandomAccessIterator _Last
);
这个函数操作的对象是容器的迭代器,即我们需要将存储数据从数组变为容器就好了,下面代码实现一下:
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
void randperm(int Num)
{
vector<int> temp;
for (int i = 0; i < Num; ++i)
{
temp.push_back(i + 1);
}
random_shuffle(temp.begin(), temp.end());
for (int i = 0; i < temp.size(); i++)
{
cout << temp