我正在尝试使用以下方法创建无重复的随机整数数组生成器:
int pt_rand(int nbits) {
int mask;
if (0 < nbits && nbits < sizeof(int)*8) {
mask = ~(~((unsigned int) 0) << nbits);
}
else {
mask = ~((unsigned int) 0);
}
return rand() & mask;
}
int *gen_rand_int_array_nodups(int length, int nbits) {
int * a = malloc(sizeof(int)*length);
for (int i = 0; i < length; i++) {
a[i] = pt_rand(nbits);
for (int j = 0; j < i; j++) {
do {
a[i] = pt_rand(nbits);
} while (a[i] == a[j]);
}
}
shuffle_int_array(a, length);
return a;
}
此代码试图通过逐个检查元素来生成给定nbits内的唯一随机整数。但是,我仍然在结果中得到重复,我还没弄清楚原因。我知道使用这种方法生成唯一的随机数这是一个不好的做法,但我的任务要求要求我以某种方式使用nbits参数。我通过填充增量编号的数组来查找相同的最简单的方法并交换它们,但这只是一个替代解决方案,我仍然需要确认是否允许我使用它。
答案 0 :(得分:0)
for (int j = 0; j < i; j++) {
do {
a[i] = pt_rand(nbits);
} while (a[i] == a[j]);
}
说i=3
,j=1
,a={5,2,3,2}
。现在你发现你已经拥有2
...所以说pt_rand()
现在给你5
。你如何发现你已经拥有5
?
更正版本:
int *gen_rand_int_array_nodups(int length, int nbits) {
int * a = malloc(sizeof(int)*length);
for (int i = 0; i < length; i++) {
int duplicate;
do
{
duplicate = 0;
a[i] = pt_rand(nbits);
for (int j = 0; j < i; j++) {
if (a[j] == a[i])
{
duplicate = 1;
break;
}
}
} while (duplicate);
}
shuffle_int_array(a, length);
return a;
}