使用-不使用 while 循环在 C 中随机播放一个 int 数组

Shuffle an array of int in C with - without while loop

我想随机播放一个整数数组,该数组已排序且大小为 n,值为 1 - n。 我只是想避免使用 while 循环以确保 rand() 不会给我相同的索引。 代码看起来像这样:

void shuffleArr(int* arr, size_t n)
{
  int newIndx = 0;
  int i = 0;

  for(; i < n - 1; ++i)
  {
    while((newIndx = i + rand() % (n - i)) == i);

    swap(i, newIndx, arr);
  }
}

for 循环直到 n-1,所以例如在最后 运行 它有 50/50 的机会等于 i。我想避免这种想法。

如果您要搜索 1...n 范围内的随机数但不包括该范围内的某个数字 m,则可以改为获取 1...(n-1) 范围内的随机数,并且对于任何结果 >= m 将值加 1。

如果您正在寻找对有限列表改组算法的解释,请在此处查看 Fisher-Yates:https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

这是解决方案,它涉及到两者。

void Shuffle(int[] arr, size_t n)
{
  int newIndx = 0;
  int i = 0;

  for(; i < n - 2; ++i)
  {
    newIndx = i + rand() % (n - i);
    if(newIndx == i)
    {
      ++newIndx;
    }

    swap(i, newIndx, arr);
  }
}

不需要循环直到有一个好的(随机数!= i),因为它是固定的if + newIndx的增量。