我正在编写一个函数,该函数应该使用从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的数字数组。如何生成唯一数字的实际随机序列。
您引用的答案中的算法实施示例如下:
#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的不是接近而是相等
所以的初始值rn和rm是相同的。因此,由于以下原因,该算法无法正常工作:
whatever % rn < rm
Run Code Online (Sandbox Code Playgroud)
永远是真实的,就像345436 % 22 < 22从a % b < b永远这样。
因此,测试始终是真实的,整数存储在每个时间,所以in并im逐步提高,等等。
我基本上需要将数字数组从0改到n
该算法不是您所需要的:它根本不会对数组进行随机排序,它会通过从不时增加的值中选择一个来产生有序的随机数(因此,是唯一的)。像执行操作一样约束值会强制算法发布范围的所有值。
C语言中的Shuffle数组会带来更好的运气