随机播放一个结构

Eri*_*rik 2 c shuffle

我有一个有6个成员的结构.我想改组结构,所以当用户点击Enter键时,struct成员会随机打印出来,如下所示:

第一次:

Member3 - Member1
Member4 - Member6
Member5 - Member2
Run Code Online (Sandbox Code Playgroud)

第二次:

Member1 - Member6
Member3 - Member5
Member2 - Member4
Run Code Online (Sandbox Code Playgroud)

等等,只要用户点击Enter kyboard,成员就会随机播放.

这是我到目前为止:

 int main(void) {
   struct Members[] = {
    { "Member1", 0, 0, 0},
    { "Member2", 0, 0, 0},
    { "Member3", 0, 0, 0},
    { "Member4", 0, 0, 0},
    { "Member5", 0, 0, 0},
     };

   do
 {


  Shuffle(Members, 6)

  }while(getch() != ESC);
 }
Run Code Online (Sandbox Code Playgroud)

编辑:这是Fisher-Yates shuffle的一个很好的实现吗?

    static int rand_int(int n)
    {
  int limit = RAND_MAX - RAND_MAX % n;
  int rnd;

  do
  {
    rnd = rand();

  }while(rnd >= limit);

  return rnd % n;
      }

void shuffle(Members *s, int n)
{
int i, j;
Members tmp;

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

    tmp = s[j];
    s[j] = s[i];
    s[i] = tmp;

    printf("%s\t - %s\n", s[j], s[i]);
}
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*oel 5

通过维基百科Fisher Yates Shuffle:

To shuffle an array a of n elements (indexes 0..n-1):
  for i from n ? 1 downto 1 do
       j ? random integer with 0 ? j ? i
       exchange a[j] and a[i]
Run Code Online (Sandbox Code Playgroud)

你的怪癖是你必须在交换期间重新分配每个结构的每个元素.一种更简单,更省时的方法来完成相同的事情是有一个用于交换目的的指针数组