Fisher Yates混洗算法的C语言实现

esbemjvw  于 2023-02-21  发布在  其他
关注(0)|答案(2)|浏览(111)

我被要求在一个数组上使用FisherYates shuffle,该数组将使用函数从一个文件中获取(我设法做到了)。

int FisherYates(int *player, int n) { //implementation of Fisher                 
     int i, j, tmp; // create local variables to hold values for shuffle

     for (i = n - 1; i > 0; i--) { // for loop to shuffle
         j = rand(); //randomise j for shuffle with Fisher Yates
         tmp = player[j];
         player[j] = player[i];
         player[i] = tmp;
     }
     return player;
}

它基本上只需要打乱玩家列表并返回输出,这样我就可以在main()中打印出来。
如果有人能告诉我如何修改代码使其工作,我将非常感激,因为在这个版本中,我在编译时得到一个错误:

invalid conversion from 'int*' to 'int' [-fpermissive]
7gcisfzg

7gcisfzg1#

player中已经有了结果,所以返回void应该可以。
Reference for Fisher-Yates

void FisherYates(int *player, int n) { //implementation of Fisher
     int i, j, tmp; // create local variables to hold values for shuffle

     for (i = n - 1; i > 0; i--) { // for loop to shuffle
         j = rand() % (i + 1); //randomise j for shuffle with Fisher Yates
         tmp = player[j];
         player[j] = player[i];
         player[i] = tmp;
     }
}
mspsb9vt

mspsb9vt2#

关于函数的两个要点:

  1. rand()要求调用 * srand(...) * 作为数字生成器的种子。
    字符串(clock());
    对于(i=n-1; i〉0;i--){ // for循环来混洗j =兰德()%n;//用Fisher Yates随机化j进行 Shuffle ...
  2. int FisherYates(int *player, int n)原型化为返回int,但您返回的是pointer to int选项将按照Tectrendz的建议执行,只需更改原型以返回void(因为player在参数中返回),***或***修改函数返回一个int *,但这是多余的,因为(int *player,...允许通过参数返回值。

相关问题