相关疑难解决方法(0)

这个Fisher-Yates的C实现是否正确?

这是Fisher-Yates的C实现,我想在一个套牌改组例程中使用它.我这样做是否正确(n =数组的长度)?

注意:do-while循环尝试校正模偏差(参见此处).它为程序增加了一些开销,如果您不关心低位偏置,可以将其消除.

void shuffle(int *array, int n) {

  int i, j, tmp, upper_bound;

  srand(time(NULL));

  for (i = n - 1; i > 0; i--) {

    upper_bound = RAND_MAX - ((RAND_MAX % (i + 1)) + 1);

    do {
      j = rand() % (i + 1);
    } while (j > upper_bound);

    tmp = array[j];
    array[j] = array[i];
    array[i] = tmp;   
  }
}
Run Code Online (Sandbox Code Playgroud)

c shuffle

10
推荐指数
1
解决办法
1万
查看次数

标签 统计

c ×1

shuffle ×1