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

如何编写C语言数组随机洗牌函数?需循环y²次交换随机位置元素

正确实现指定的数组随机打乱函数

原代码存在的问题

  • 错误使用#define array x,造成标识符混淆,完全无必要添加该宏定义
  • 函数参数不符合需求:要求接收数组和大小,但原函数仅接收size,还在函数内部错误定义未初始化的数组int array[x];,函数应直接操作传入的外部数组而非自行创建
  • 初始化逻辑错误:原代码试图给未定义的x变量对应的数组赋值,且需求中不需要函数初始化数组,只需打乱传入的已有数组
  • 随机数使用错误:srand(time(NULL))放在函数内会导致多次调用函数时,因时间间隔过短生成重复的随机数序列,应该只在程序入口处调用一次
  • 打乱逻辑不符合要求:要求循环y²次且每次随机选取两个索引交换,原代码仅循环size次且固定与当前循环索引交换

正确实现代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 接收待打乱的数组x和数组大小y,按需求打乱数组
void shuffle_array(int x[], int y) {
    // 循环y²次执行随机交换
    for (int i = 0; i < y * y; i++) {
        // 生成两个[0, y-1]范围内的随机索引
        int a = rand() % y;
        int b = rand() % y;
        // 交换两个索引对应的元素
        int temp = x[a];
        x[a] = x[b];
        x[b] = temp;
    }
}

int main() {
    // 仅初始化一次随机数种子,保证随机性
    srand(time(NULL));
    
    int arr[] = {1, 2, 3, 4, 5, 6};
    int size = sizeof(arr) / sizeof(arr[0]);
    
    printf("原数组:");
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    shuffle_array(arr, size);
    
    printf("打乱后数组:");
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    return 0;
}

代码说明

  • 函数shuffle_array严格匹配需求:参数为待打乱数组和数组大小
  • 循环次数设置为y * y,满足要求的循环次数
  • 每次循环生成两个独立的随机索引,确保交换操作的随机性
  • 随机数种子放在main函数中仅初始化一次,避免重复随机序列
  • 函数仅负责打乱数组,不做初始化操作,符合“接收已有数组”的需求

内容的提问来源于stack exchange,提问作者thora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:40:28