洗牌和洗牌后未洗牌的字符串与原始字符串不同
Unshuffled string is different from original string after shuffling and unshuffling
我实际上是在实现一个带有非洗牌功能的洗牌功能。我正在使用带有固定种子的伪随机数生成器的 Fisher-Yates 算法。然而,未改组的字符串看起来不像初始字符串。
我检查了我的随机数组在洗牌函数和非洗牌函数中是否相同。 unshuffling函数与shuffle函数相同,只是相反。
这是我的洗牌函数:
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);
}
这是我的输出:
它似乎缺少一个循环或类似的内容。
添加一个 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
.
或许您应该将 shuffle
中的 for
循环更改为
for(j = size_phrase -1 ; j >= 0 ; j-- , k++)
我实际上是在实现一个带有非洗牌功能的洗牌功能。我正在使用带有固定种子的伪随机数生成器的 Fisher-Yates 算法。然而,未改组的字符串看起来不像初始字符串。
我检查了我的随机数组在洗牌函数和非洗牌函数中是否相同。 unshuffling函数与shuffle函数相同,只是相反。
这是我的洗牌函数:
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);
}
这是我的输出:
它似乎缺少一个循环或类似的内容。
添加一个 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
.
或许您应该将 shuffle
中的 for
循环更改为
for(j = size_phrase -1 ; j >= 0 ; j-- , k++)