如何在C语言中无重复打乱姓名字符串并分组为4组每组3人
实现无重复随机分组的C语言方案
嘿,这个需求很清晰,咱们可以用Fisher-Yates洗牌算法来实现无重复打乱,然后再按要求分组输出就行。下面是完整的可运行代码,我会一步步解释关键部分:
完整代码实现
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> // Fisher-Yates 洗牌函数,用于无重复打乱字符串数组 void shuffle(char *names[], int count) { // 初始化随机数种子,确保每次运行结果不同 srand(time(NULL)); for (int i = count - 1; i > 0; i--) { // 生成0到i之间的随机索引 int j = rand() % (i + 1); // 交换当前元素和随机选中的元素 char *temp = names[i]; names[i] = names[j]; names[j] = temp; } } int main() { // 定义12个学生姓名的字符串数组 char *students[] = { "Niko", "Jacob", "Roman", "Vlad", "Corvo", "Daud", "Hitman", "Harry", "Ron", "Fred", "George", "Dimitri" }; int total = sizeof(students) / sizeof(students[0]); int groupSize = 3; int groupCount = total / groupSize; // 4组 // 打乱数组 shuffle(students, total); // 按要求格式输出分组 for (int i = 0; i < groupCount; i++) { // 输出当前组的第一个成员 printf("%s", students[i * groupSize]); // 输出组内剩余成员,前面加逗号 for (int j = 1; j < groupSize; j++) { printf(",%s", students[i * groupSize + j]); } // 每组结尾加句号,最后一组也加(和示例一致) printf(". "); } printf("\n"); return 0; }
关键细节解释
- Fisher-Yates洗牌算法:这是实现无重复随机打乱的标准方法,从数组末尾开始,每次将当前元素与前面随机位置的元素交换,能保证每个元素出现在任意位置的概率均等,完全避免重复。
- 随机种子初始化:
srand(time(NULL))用当前时间作为随机种子,这样每次运行程序都会得到不同的打乱结果,如果不加这行,每次运行的随机序列都是固定的。 - 分组逻辑:通过
i * groupSize计算每组的起始索引,然后循环输出组内的3个成员,组内用逗号分隔,每组结尾加句号和空格,完全匹配你给出的示例格式。 - 字符串数组处理:这里用
char *数组存储姓名,避免了字符串拷贝的麻烦,直接交换指针就能完成元素位置的调换,效率很高。
你可以直接把这段代码复制到C语言编译器里运行,每次都会得到不同的随机分组结果,完全符合你的需求~
内容的提问来源于stack exchange,提问作者ImtiazIrtiaz
相关产品推荐
相关产品推荐

