Несмешанная строка отличается от исходной строки после перетасовки и перемешивания - PullRequest
0 голосов
/ 08 февраля 2019

Я на самом деле реализую функцию перетасовки с функцией перетасовки.Я использую алгоритм Фишера-Йейтса с генератором псевдослучайных чисел с фиксированным начальным числом.Однако не перетасованная строка не похожа на исходную.

Я проверил, совпадает ли мой случайный массив в функции перетасовки и функции перестановки.Функция перестановки аналогична функции перестановки, но в обратном порядке.

Вот моя функция перетасовки:

void shuffle(char * phrase) 
    {
        int size_phrase = strlen(phrase);
        srand(seed);
        int * rdm_array = (int*)malloc(sizeof(int)*size_phrase);
        int i;
        for(i = 0; i < size_phrase; i++)
        {
            rdm_array[i] = rand()%size_phrase;
            //printf("%d", rdm_array[i]);
        }
        //begin shuffle here
        int j;
        int k = 0;
        for(j = size_phrase -1 ; j > 0 ; j-- , k++)
        {
            int rdm_nb = rdm_array[k];
            char temp = phrase[j];
            phrase[j] = phrase[rdm_nb];
            phrase[rdm_nb] = temp;
        }
        free(rdm_array);
    }

А вот моя функция перетасовки:

 void unshuffle(char * phrase)
{
    int size_phrase = strlen(phrase);
    srand(seed);
    int * rdm_array = (int*)malloc(sizeof(int)*size_phrase);
    int i;
    for(i = 0; i < size_phrase; i++)
    {
        rdm_array[i] = rand()%size_phrase; 
        //printf("%i", rdm_array[i]);
    }
    //On commence le mélange ici
    int j;
    int k = size_phrase-1;
    for(j = 0 ; j < size_phrase ; j++ , k--)
    {
        int rdm_nb = rdm_array[k];
        char temp = phrase[j];
        phrase[j] = phrase[rdm_nb];
        phrase[rdm_nb] = temp;  
    }
    free(rdm_array);
}

И вот мой вывод:

My Output

Похоже, что отсутствует один цикл или что-то в этом роде.

1 Ответ

0 голосов
/ 08 февраля 2019

Добавьте printf, чтобы показать, как происходит обмен в shuffle и unshuffle следующим образом

        /* after this line */
        int rdm_nb = rdm_array[k];
        /* insert debug output */
        printf("%d <-> %d\n", j, rdm_nb);

Вы увидите, что в функции shuffle переменная j отсчитывает от size_phrase -1 до 1, в то время как в unshuffle он считается от 0 до size_phrase -1.

Возможно, вам следует изменить цикл for в shuffle на

    for(j = size_phrase -1 ; j >= 0 ; j-- , k++)
...