【问题标题】:How to randomly pick more than one different array elements in C?如何在 C 中随机选择多个不同的数组元素?
【发布时间】:2016-01-17 21:00:54
【问题描述】:

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

提前谢谢你。

【问题讨论】:

    标签: c arrays random


    【解决方案1】:

    我会考虑改组数组,然后使用前半部分条目,或者如果我无法重新排序数组,我会改组索引数组,然后使用它们指向其他数组。

    这需要大量额外的存储空间,这可能是一个严重的问题,也可能不是。洗牌很容易出错,但很容易研究并且很容易找到有效的现有算法。

    【讨论】:

    • 非常好的想法,也是我想出的想法之一,但是我必须按原样重新排序数组,以便清楚地打印值修改。谢谢,我试试看。
    【解决方案2】:

    如果有一个额外的数组来跟踪已经选择的元素,并且只要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) 额外空间,希望这不成问题。

    【讨论】:

    • 请注意,此方法需要 O(n) 额外空间,希望这不成问题
    • 不幸的是,它不允许我初始化可变大小的临时数组,所以我尝试不初始化而只是声明它,但仍然相同。无论如何,非常感谢你
    • 啊,对不起,我忘了。我已经修改了答案——使用 malloc 来声明数组,并在以后释放该空间。
    • if (temp[l] == 0) { 是未定义的行为,因为 temp[i] 尚未初始化。 "// 用全零值初始化元素" 不正确。
    • @chux:谢谢。我的意思是calloc,但写错了malloc。现已修复。
    猜你喜欢
    • 2014-03-22
    • 2018-11-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多