如何在C中随机选择多个不同的数组元素?

时间:2016-01-17 21:00:54

标签: c arrays random

首先,我是编程新手,我正试图解决这个问题。在动态创建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;
}

提前谢谢。

2 个答案:

答案 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)空间,这有望成为问题。