首先,我是编程新手,我正试图解决这个问题。在动态创建N个整数的数组(N由用户插入并且元素是随机数)之后,我试图随机选择一半元素(N / 2)并随机修改它们。我随机挑选和修改的代码如下(b是数组,它在我的代码中是先前声明的):
for(int j=0; j<(N/2); j++){
int l=rand() % (N + 1 - 0) + 0;
b[l]= rand() % (100 + 1 - (-100)) + (-100);
}
问题在于,以这种方式,有可能选择相同的元素进行修改。我怎么能避免这个?我尝试了以下代码,但没有成功。
int n=-1;
for(int j=0; j<(N/2); j++){
int l=rand() % (N + 1 - 0) + 0;
b[l]= rand() % (100 + 1 - (-100)) + (-100);
if(l == n){
j--;
}
n=l;
}
提前谢谢。
答案 0 :(得分:1)
我会考虑改组数组,然后使用条目条目的前半部分,或者如果我不能重新排序数组,我会改组索引数组,然后用它们指向其他阵列。
这需要大量额外的存储空间,这可能是也可能不是一个严重的问题。改组容易出错,但易于研究并且易于找到有效的现有算法。
答案 1 :(得分:0)
如何使用额外的数组来跟踪已经选择的元素,只要rand()
返回的元素是已经修改过的元素,选择另一个元素?像这样:
int *temp = (int *) calloc(N, sizeof(int)); // initialize elements with all zero values
for(int j=0; j<(N/2); j++){
int done = 0;
int l;
while (!done) {
l=rand() % (N + 1 - 0) + 0;
if (temp[l] == 0) {
temp[l] = 1;
done = 1;
}
}
b[l]= rand() % (100 + 1 - (-100)) + (-100);
}
free(temp);
请注意,此方法需要额外的O(n)空间,这有望成为问题。