生成唯一随机数数组

Ach*_*113 4 c random

我正在编写一个函数,该函数应该使用从0到n的随机数填充数组(其中n是传递给该函数的参数),但是数组中的所有数字都应该是唯一的。我基本上需要将数字数组从0改到n

我在这里找到了这个答案:用C编程语言在整数数组中的唯一随机数

并使用了用户建议的“ Knuth算法”:

void generate_random_array(int count)
{
  int in, im;

  im = 0;
  srand(time(NULL));

  for (in = 0; in < count && im < count; ++in) {
    int rn = count - in;
    int rm = count - im;
    if (rand() % rn < rm) random_array[im++] = in; 
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,此函数根本不会为我生成随机数,它只是创建了一个从0到count的数字数组。如何生成唯一数字的实际随机序列。

Jea*_*bre 8

您引用的答案中的算法实施示例如下:

#define M 10
#define N 100

int in, im;

im = 0;

for (in = 0; in < N && im < M; ++in) {
  int rn = N - in;
  int rm = M - im;
  if (rand() % rn < rm)    
    /* Take it */
    vektor[im++] = in + 1; /* +1 since your range begins from 1 */
}
Run Code Online (Sandbox Code Playgroud)

Knuth算法。这是一个非常简单的算法,复杂度为O(N)(即数值范围),这意味着当M接近N时,它最有用。

但是您设置M == N的不是接近而是相等

所以的初始值rnrm是相同的。因此,由于以下原因,该算法无法正常工作:

whatever % rn < rm
Run Code Online (Sandbox Code Playgroud)

永远是真实的,就像345436 % 22 < 22a % b < b永远这样。

因此,测试始终是真实的,整数存储在每个时间,所以inim逐步提高,等等。

我基本上需要将数字数组从0改到n

该算法不是您所需要的:它根本不会对数组进行随机排序,它会通过从不时增加的值中选择一个来产生有序的随机数(因此,是唯一的)。像执行操作一样约束值会强制算法发布范围的所有值。

C语言中的Shuffle数组会带来更好的运气