Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中随机选取多个不同的数组元素?_C_Arrays_Random - Fatal编程技术网

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

如何在C中随机选取多个不同的数组元素?,c,arrays,random,C,Arrays,Random,首先,我是编程新手,我正在努力解决这个问题。在动态创建了一个由N个整数组成的数组(N由用户插入,元素是随机数)之后,我尝试随机选取一半元素(N/2)并随机修改它们。我随机选取和修改的代码如下(b是数组,它在我的代码中较早声明): for(int j=0;j用一个额外的数组来跟踪已经选择的元素怎么样,只要rand()返回的元素是一个已经修改过的元素,就选择另一个?如下所示: int *temp = (int *) calloc(N, sizeof(int)); // initialize elem

首先,我是编程新手,我正在努力解决这个问题。在动态创建了一个由N个整数组成的数组(N由用户插入,元素是随机数)之后,我尝试随机选取一半元素(N/2)并随机修改它们。我随机选取和修改的代码如下(b是数组,它在我的代码中较早声明):


for(int j=0;j用一个额外的数组来跟踪已经选择的元素怎么样,只要
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);
int*temp=(int*)calloc(N,sizeof(int));//用所有零值初始化元素

对于(int j=0;j<p>),我会考虑洗牌数组,然后使用前半条条目,或者如果我不能重新排列数组,我会改组索引数组,然后用它们指向另一个数组。
这将需要大量额外的存储空间,这可能是一个严重的问题,也可能不是一个严重的问题。洗牌很容易出错,但很容易研究,也很容易找到有效的现有算法。

注意,这种方法需要O(n)额外的空间,希望这不应该是一个问题,因为它不允许我初始化可变大小的临时数组,所以我尝试不初始化,只是声明它,但仍然是一样的。无论如何,非常感谢你,很抱歉,我忘了。我修改了答案-使用malloc声明数组,并免费释放它稍后使用空格。
如果(temp[l]==0){
是未定义的行为,因为
temp[i]
尚未初始化。“//使用所有零值初始化元素”不是真的。@chux:谢谢。我的意思是
calloc
,但写错了
malloc
。现在已修复。这是一个非常好的主意,也是我想到的方法之一,但是我必须按照原来的方式重新排序数组,以便清楚地打印值修改。谢谢,我会尝试一下。
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;
}
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);