【问题标题】:How Can I Reduce The Time Taken For The Code Execution Below?如何减少下面代码执行所花费的时间?
【发布时间】:2018-07-27 11:54:47
【问题描述】:

用途:以随机顺序存储 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执行代码来检查效率。

【问题讨论】:

  • 与您的问题有点相关:您应该只调用srand一次。如果您在紧密循环中调用它,您将多次将种子设置为相同的值,这将导致多次生成相同的随机数。
  • @Someprogrammerdude 这非常相关。您可以将其发布为答案。 :-)(或查找重复项)
  • 每个员工肯定都有一个员工编号 - 可以吗?
  • 我的意思是只调用 srand 一次
  • @WilliamJBagshaw 请阅读我提供的关于设置数据结构的链接。它是一种包含唯一键的数据类型。您不能插入重复项。这就是为什么人们可以生成随机数而无需检查重复项,因为这将通过插入到集合中来处理。

标签: c performance


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    因此你可以尝试一个简单的方法:

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

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

    这个解决方案类似于威廉的回答。我真的不知道结果是否具有更好的“随机性”。

    【讨论】:

      【解决方案3】:

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

      这是因为处理器无法预测在随机数上选择哪种方式。

      例如

      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;
          // ...
      }
      

      【讨论】:

        猜你喜欢
        • 2020-06-05
        • 2015-05-12
        • 1970-01-01
        • 2020-09-20
        • 2021-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多