You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:05:47