我实在想不通,这明明10ms以内就能完成的啊?
#include <iostream>
#include <ctime>
using namespace std;
int randInt(int l, int r) {
srand(time(0));
return rand() % (r - l + 1) + l;//从l...r之间任取一个数
}
bool check(int index, int arr[], int target) {
for (int i = 0; i < index; ++i) {
if (target == arr[i]) {
return true;
}
}
return false;
}
void algorithm1(int arr[], int size, int rangeLeft, int rangeRight) {
int random;
for (int i = 0; i < size; ++i) {
random = randInt(rangeLeft, rangeRight);
while (check(i, arr, random)) {
random = randInt(rangeLeft, rangeRight);
}
arr[i] = random;
}
}
void algorithm2(int arr[], int size, int rangeLeft, int rangeRight) {
bool *used = new bool[rangeRight + 1];
for (int i = 0; i < rangeRight + 1; ++i) {
used[i] = false;
}
int random;
for (int j = 0; j < size; ++j) {
random = randInt(rangeLeft, rangeRight);
while (used[random]) {
random = randInt(rangeLeft, rangeRight);
}
used[random] = true;
arr[j] = random;
}
delete[]used;
}
void algorithm3(int arr[], int size) {
for (int j = 0; j < size; ++j) {
arr[j] = j + 1;
}
for (int i = 0; i < size; ++i) {
swap(arr[i], arr[randInt(0, i)]);
}
}
int main() {
int arr[10] = {0};
algorithm1(arr, 10, 1, 10);
//algorithm3(arr, 10);
for (int i = 0; i < 10; ++i) {
cout << arr[i] << endl;
}
}
耗时间的并不是srand(time(0));,而是超短时间内srand(time(0)),再rand的话,得到的随机数是相同的,因为你去重需要不断的重复遍历数组,因此才浪费的时间。这个种子,隔一段时间用一次就可以了,间隔太短的话,生成的随机数反而不随机,你可以看看它生成的原理,这个函数没有封装起来,你可以直接查看。
你把srand(time(0));
去掉就快了,主要是这一步在消耗时间
别人把根本原因写得挺清楚了,只做点补充。
第一,srand初始化随机发生器是一定要的,但不用每次都初始化。(srand放进主函数一开始的地方)
第二,rand随机化已经是过去时了,现在的c++有专门的random库(是STL的一部分),建议用那个。(random_device和你想要的随机化算法,个人倾向于mt19937)
第三,你的算法1本身也十分低效。看你的代码,要达到你的需求,应该用random_shuffle而非这种朴素做法。我注意到,你的算法3就是一种shuffle,这个时间复杂度要低很多,当然会快很多。