当前位置: 首页 > 知识库问答 >
问题:

如何在C中生成随机唯一整数数组?

戎兴言
2023-03-14

我正在创建一个C-prog,它需要一个由17个整数组成的数组,所有整数都小于18并且是唯一的。这是我现在能做的:

int ques_arr[17];
int x,y;
time_t t;
srand((unsigned)time(&t));

for(int a=0; a<17; a++)
{
x=rand()%18; //Assume that srand() has been declared in the program
 for(int aa=0; aa<17; aa++)
 {
  if(x==ques_arr[aa])
   { do{
        y=0;
        y=rand()%18;
        }while(y==ques_arr[aa]);
      x=y; 
      ques_arr[a]=x;
    }else ques_arr[a]=x;
  }
}

我现在的算法是,每次rand()生成一个数字时,都会在数组中检查这个数字是否已经存在,如果已经存在,则rand()会继续生成一个数字,直到得到一个唯一的数字,然后将其存储在数组中,如果数组中不存在这样的数字,则直接输入到数组中。

共有1个答案

江向阳
2023-03-14

这不是一个最佳解决方案,您的时间复杂度一旦您修复了您的代码中的问题是O(n²),您可以使用“Knuth Shuffle算法”将时间复杂度降低到O(n):

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <time.h>

static int rrand(int value)
{
    return (int)((double)value * (rand() / (RAND_MAX + 1.0)));
}

static void randomize(int arr[], int size)
{
    for (int idx = 0; idx < size; idx++)
    {
        arr[idx] = idx;
    }
    for (int idx = size; idx > 1; idx--)
    {
        int num = rrand(idx);
        int tmp = arr[idx - 1];

        arr[idx - 1] = arr[num];
        arr[num] = tmp;
    }
}

int main(void)
{
    srand((unsigned)time(NULL));

    int arr[17] = {0};
    int size = sizeof arr / sizeof *arr;

    randomize(arr, size);
    for (int idx = 0; idx < size; idx++)
    {
        printf("%d\n", arr[idx]);
    }
    return 0;
}
 类似资料:
  • 问题内容: 我上面有一个方法,该方法应生成用户指定的随机元素数组。随机生成的整数应介于0到10之间(含0和10)。我能够生成随机整数,但是我遇到的问题是检查唯一性。我尝试检查唯一性是在上面的代码中,但是数组仍然包含整数的重复项。我做错了什么,有人可以给我提示吗? 问题答案: 您确实找到重复的值。但是,您将其替换为另一个可能重复的随机数。相反,请尝试以下操作: 但是,这种方法效率低下。我建议列出数字

  • 我想用骰子做一个游戏,我需要在其中加入随机数(以模拟骰子的侧面。我知道如何在1到6之间进行)。使用 不能很好地工作,因为当我运行程序几次时,我得到的输出是: 所以我想要一个每次都会生成不同随机数的命令,而不是连续5次生成相同的随机数。是否有命令可以执行此操作?

  • 如何在1到9之间生成9个随机数,而不重复,一个接一个。它类似于:假设生成的第一个随机数是4,那么下一个随机数必须在[1,9]{4}中。我的第一种方法是将每个随机生成的数字添加到一个集合中,从而避免重复。但在更糟糕的情况下,比如我们已经生成了6个数字,我们必须再生成3个数字,这个过程会有点慢。当范围从[1,9]更改为[1,1000]时,这种方法听起来不正确。有人能提出一个替代方法吗。

  • 问题内容: 我想在0-500范围内创建10个随机数。但是问题是我希望这些数字是唯一的。对于2个随机数,我可以创建以下内容: 但是,如果我这样做10次,我认为它会堆叠。我之所以这样说是因为我正在尝试创建一个巨大的算法,该算法试图进行连续评估,我希望连续获取10个随机且唯一的数字。我不知道该怎么办。有什么想法或建议吗? 问题答案: 每当您使用Fisher-Yates shuffle 来使用数字时,请从

  • 问题内容: 如何生成不猜测下一个数字的java中的整数的唯一ID? 问题答案: 它需要有多独特? 如果它仅在流程中唯一,则可以在每次需要新值时使用和调用。

  • 问题内容: 我正在尝试获取0到100之间的随机数。但是我希望它们是唯一的,而不是在序列中重复。例如,如果我有5个数字,它们应该是82,12,53,64,32而不是82,12,53,12,32(我使用了这个数字),但是它在序列中生成相同的数字。 问题答案: Add each number in the range sequentially in a list structure. Shuffle i