网站首页 > 技术文章 正文
在某些应用场景中,可能需要将一个数组的元素重新随机排列,我们可以称之为洗牌算法。其原理并不复杂,就是需要遍历整个数组,如果数组有n个元素,每当遍历到第 i个数组元素时(i为数组元素的索引),再从 0 到 n-1 随机生成一个数字记为index,再把索引为 i 和 index 的两个数组元素进行互换,直至遍历结束。这样就完成了数组的随机排序。
举个例子说明,把一个含10个元素的数组array[10]重新随机排序,C代码如下:
uint8_t num = 10;
uint8_t array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
void array_shuffle(uint32_t seed)
{
uint8_t i, index, value;
uint32_t tmp_seed;
tmp_seed = seed;
for(i=0; i<10; i++)
{
tmp_seed = tmp_seed * 1103515245 + 12345;
index = (uint8_t)((tmp_seed >> 16)%(num - i) + i);
value = array[i];
array[i] = array[index];
array[index] = value;
}
}
其中参数seed是随机数种子,使用相同的随机数种子可以得到相同的数组随机排序。
当seed = 102的话,重新排序后 array[10] = {2, 1, 8, 5, 10, 3, 7, 6, 9, 4};
当seed = 105的话,重新排序后 array[10] = {7, 5, 9, 2, 8, 10, 1, 4, 3, 6};
如果还有什么好的方法
,欢迎一起讨论。
- 上一篇: STM32-详解C语言数组指针比较字符串原理
- 下一篇: 深度解读C/C++指针与数组
猜你喜欢
- 2025-06-25 C语言入门到精通第027讲-C语言传递数组给函数
- 2025-06-25 「C语言」指针进阶第三站,数组指针
- 2025-06-25 C语言基础知识:指针和数组的区别是什么?
- 2025-06-25 合并两个数组
- 2025-06-25 C语言100题集合023-输入月份号并输出英文月份名
- 2025-06-25 C语言字符数组和字符串
- 2025-06-25 C语言100题集合027-二维数组的经典案例,非常重要
- 2025-06-25 C语言中的一维数组理解
- 2025-06-25 Excel三种方法多条件筛选,你都用过吗?
- 2025-06-25 C语言-数组平均值与排序
- 06-25C语言入门到精通第027讲-C语言传递数组给函数
- 06-25「C语言」指针进阶第三站,数组指针
- 06-25C语言基础知识:指针和数组的区别是什么?
- 06-25合并两个数组
- 06-25C语言100题集合023-输入月份号并输出英文月份名
- 06-25C语言字符数组和字符串
- 06-25C语言100题集合027-二维数组的经典案例,非常重要
- 06-25C语言中的一维数组理解
- 最近发表
- 标签列表
-
- axure 注册码 (25)
- exploit db (21)
- mutex_lock (30)
- oracleclient (27)
- think in java (14)
- javascript权威指南 (19)
- nfs (25)
- componentart (17)
- yii框架 (14)
- springbatch (28)
- oracle数据库备份 (25)
- iptables (21)
- 自动化单元测试 (18)
- dir (26)
- connectionstring属性尚未初始化 (23)
- output (32)
- panel滚动条 (28)
- centos 5 4 (23)
- sql学习 (33)
- http error 503 (21)
- pop3服务器 (18)
- 图表组件 (17)
- android退出应用 (21)
- 图片透明度 (20)
- c 数组 (33)