测试了多台电脑,运行这个进程居然需要半分钟之久,能帮我看看为什么吗

我实在想不通,这明明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,这个时间复杂度要低很多,当然会快很多。