如何减少下面的代码执行时间?

时间:2018-07-27 11:54:47

标签: c performance

目的:以随机顺序存储1-1000之间的数字。

我的代码:

#include<time.h>

int main(){

    int arr[1000]={0}, store[1000];
    for(int i=0;i<1000;i++){
        int no;
        while(1){
            srand(time(0));
            no=rand();
            no%=1001;

            if(no==0)
                continue;

            //This ensures Loop will continue till the time a unique random number is generated
            if(arr[no-1]!=no){ 
                arr[no-1]=no; 
                break;
            }

        }

        store[i]=no;
    }

对我来说,代码可以正常工作,但是我花了58分钟执行时间。有办法加快程序速度吗?

实用目的:我有大约4000名员工,并且我想给他们每个人一个唯一的随机数,用于即将进行的项目。

我尝试使用1000执行代码以检查效率。

3 个答案:

答案 0 :(得分:0)

创建一个包含1到n的数组。遍历列表并将该条目与随机选择的条目交换。然后,您将获得一个包含1到n的随机列表。

答案 1 :(得分:0)

从第一句话开始,数字不必是随机的,而只需按随机顺序即可。

因此,您可以尝试一种简单的方法:

  • 创建一个由n个元素组成的数组arr,并使用值1..n初始化。
  • 在0..n-1范围内运行循环(计数器i)
    • 选择0..n-i-1范围内的随机数x
    • 用索引i + x交换索引i上的元素

使用此算法,您无需担心随机数的冲突。 您交换数字,然后减少候选人的范围。 一次选择的号码无法在以后的步骤中选择。

此解决方案与William的答案类似。我真的不知道结果是否具有更好的“随机性”。

答案 2 :(得分:0)

尽量避免在随机数上分支。而且很可能会在现代处理器上运行得更快。

这是因为处理器无法预测随机数的选择方式。

例如

while(1){
    srand(time(0));
    no=rand();
    no%=1001;
    if(no==0)
        continue;
    // ...
}

可以更改为

srand(time(0)); // better outside the loop
while(1) {
    no = rand() % 1000 + 1;
    // ...
}