我有一个有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)
通过维基百科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)
你的怪癖是你必须在交换期间重新分配每个结构的每个元素.一种更简单,更省时的方法来完成相同的事情是有一个用于交换目的的指针数组