У меня есть структура, которая имеет 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]);
}
}