2015-11-05 57 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

完美,它的工作。謝謝您的幫助。 –

相關問題