2015-11-05 70 views
0

我有一个函数可以对数组中的元素进行混洗(可能有重复)。我的函数代码如下:C - 我的代码在一个文件中工作,但不是另一个

int shuffle_values(int *array, int max_value){ 
    int i, j; 
    int new_array[MAX_VALUE_ALLOWED]; 

    for (i = 0; i < max_value; ++i){ 
    new_array[i] = array[i]; 
    } 
    if (max_value > MAX_VALUE_ALLOWED){ 
    return 0; 
    }else{ 
    for (j = 0; j < max_value; ++j){ 
     array[j] = new_array[(random_value(max_value) - 1)]; 
    } 
    }return 1; 
} 

下面是测试我的函数的代码:

#define MAX_VALUE_ALLOWED 200 

int random_value(int max_value){ 
    int rand_val; 
    rand_val = (rand() % max_value) + 1; 

    return rand_val; 
} 

void print_values(int *array, int max_value){ 
    int i; 
    for (i = 0; i < max_value; ++i){ 
    printf("%d|", array[i]); 
    } printf("\n"); 
} 

int main() { 
    unsigned int seed = 20; 
    int values[MAX_VALUE_ALLOWED], max_value; 
    srand(seed); 

    max_value = 8; 
    shuffle_values(values, max_value); 
    print_values(values, max_value); 

    shuffle_values(values, max_value); 
    print_values(values, max_value); 

    max_value = 20; 
    shuffle_values(values, max_value); 
    print_values(values, max_value); 

    shuffle_values(values, max_value); 
    print_values(values, max_value); 

    return 0; 
} 

预期输出是:

5|4|3|1|8|6|7|2| 
3|4|7|5|8|2|1|6| 
11|7|20|4|9|19|13|12|10|14|6|2|16|1|15|5|8|18|17|3| 
6|3|5|9|14|15|20|2|10|11|16|8|7|17|1|19|18|12|4|13| 

但我发现了:

32517|-940709567|0|32517|0|0|-938539808|0| 
32517|-940709567|-938539808|0|0|-940709567|32517|-940709567| 
-940709567|-940709567|32517|32517|-940709567|0|-940709567|0|32767|32767|32517|0|1|0|0|32517|1|0|-940709567|0| 
0|-940709567|-940709567|32767|0|0|1|-940709567|32517|32767|32767|-940709567|32517|-940709567|-940709567|1|0|0|32517|-940709567| 

但是,当我测试相同代码在这里:

#include <stdio.h> 
#include <stdlib.h> 
#define MAX_VALUE_ALLOWED 200 

int random_value(int max_value){ 
    int rand_val; 
    rand_val = (rand() % max_value) + 1; 

    return rand_val; 
} 

int main(){ 
    int max_value = 8; 
    int array[8] = {1,2,3,4,5,6,7,8}; 

    int i, m; 
    printf("Original array:"); 
    for (i = 0; i < max_value; ++i){ 
    printf("%d|", array[i]); 
    }printf("\n"); 

    printf("Shuffled array:"); 
    shuffle_values(array, max_value); 
    for (m = 0; m < max_value; ++m){ 
    printf("%d|", array[m]); 
    }printf("\n"); 
    return 0; 
} 

我得到的输出是正确的:

Original array:1|2|3|4|5|6|7|8| 
Shuffled array:8|7|2|4|2|8|3|5| 

有什么想法?

+2

在第一个例子中,你在哪里给'values'数组赋值? –

+0

你似乎认为任何n次连续调用'random_value(n)'都会以某种顺序返回从0到n-1的所有值。随机数字发生器不以这种方式工作。 –

+0

OT:在'shuffle_values'的第一个'for'循环之前检查'if(max_value> MAX_VALUE_ALLOWED)'是否需要执行*。否则,在达到'if'语句之前,可能会有一个缓冲区溢出。 – user3386109

回答

3

您在内存中为您的值数组留下了随机值。它正在按照它应有的方式工作。但是,您正在使用您不想处理的数据。

尝试在洗牌之前初始化您的值数组。例如:

for (i = 0; i < max_value; ++i){ 
    array[i] = i; 
} 
+0

我实际上不允许修改main,只是它上面的函数。我可以初始化shuffle函数中的值吗? –

+1

@OlivierToujas是的,你可以在函数中初始化它们,或者更好的是,创建一个单独的函数来进行初始化。把那个数组传到那里。 – scerrecrow

+0

完美,它的工作。谢谢您的帮助。 –

相关问题