如何编写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
相关产品推荐
相关产品推荐

