Перемешать структуру - PullRequest
       5

Перемешать структуру

2 голосов
/ 01 июля 2011

У меня есть структура, которая имеет 6 членов. Я хочу перетасовать структуру, чтобы, когда пользователь нажимал клавишу Enter, члены структуры распечатывались случайным образом следующим образом:

Первый раз:

Member3 - Member1
Member4 - Member6
Member5 - Member2

Второй раз:

Member1 - Member6
Member3 - Member5
Member2 - Member4

И так до тех пор, пока пользователь нажимает на клавишу Enter, участники перемешиваются.

Это то, что я имею до сих пор:

 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);
 }

РЕДАКТИРОВАТЬ: Это хорошая реализация 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]);
}
}

1 Ответ

5 голосов
/ 01 июля 2011

Через википедию 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]

Причудой для вас является то, что вам придется переназначать каждый элемент каждой структуры во время обмена.Более простой и эффективный по времени способ сделать то же самое - иметь массив указателей для обмена местами

...