问题描述:
随机生成k个不重复的随机数(或生成0至k-1以随机顺序构成的数列)
算法:
rand不直接产生值,而是产生下标,下标可以重复,但要保证数组中都是不重复且没有输出过的数字
①一个大小为k的数组temp,temp[i]=i;一个随机下标的范围range,range初始为k;一个随机数组result
②随机生成0至range-1的一个下标index,将temp[index]放入result
③temp[index]=temp[range-1]
④range--,转②
代码:
#pragma once
#include<iostream>
#include<vector>
#include<time.h>
using namespace std;
//返回k个不同随机数按序组成的vector(以随机顺序返回0至k-1构成的vector
vector<int> diffRand(int k)
{
vector<int> result(k);
vector<int> flag(k);
for (int i = 0; i < k; i++)
flag[i] = i;
int range = k;//随机下标的范围
srand((unsigned int)time(0));
for (int i = 0; i < k; i++)
{
int randIndex = rand() % range;
result[i] = flag[randIndex];
flag[randIndex] = flag[range - 1];
range--;
}
return result;
}
void main()
{
vector<int> result = diffRand(10);
for (int i = 0; i < (int)result.size(); i++)
cout << result[i] << ' ';
cout << endl;
system("pause");
}