洗牌算法多种形式
来源:互联网 发布:淘宝助理mac版 编辑:程序博客网 时间:2024/05/19 07:07
洗牌算法直观的来说,是将一幅有序的扑克牌经过处理后变成乱序的。这个处理的过程就是洗牌算法了,当然这里的扑克牌也许是其他的数据等等,算法要保证乱序后的数据和之前的一模一样,只是顺序不同而已。下面就针对不同形式的洗牌算法给出代码。
有54张牌,乱序存储在一个整型数组中arr[54]。一副牌就用1,,,54这54个数字代替。
//从无到有随机生成一副牌序void MyShuffle_NonToSome(int arr[] ,int num){srand(time(NULL));int pos,temp = 0;memset(arr,0,sizeof(int) * num);for (int idx = 1; idx <= 54; idx++){do {pos = rand() % num;} while (arr[pos] != 0);arr[pos] = idx;}}
这种方式下,首先是两层循环的嵌套,本来就降低了效率,而且随着数组中数据的增多里层循环执行的次数也越来越多。
rand()的定义:
srand()的定义:
针对一个已经给出的有序的序列,可以采用随机交换两个数组元素的方式实现乱序。至于交换的次数由个人来定,交换的次数越多就越接近乱序,就越有效。
//基于N次交换的随机算法,固定循环次数void MyShuffle_Ns_Swap(int arr[], int num){int pos1,pos2;int temp = 0;srand(time(NULL));for (int idx = 0; idx < num; idx++){pos1 = rand() % num;pos2 = rand() % num;if (pos1 != pos2){temp = arr[pos1];arr[pos1] = arr[pos2];arr[pos2] = temp;}}}这种方法循环次数一定,交换次数一般情况下就是数据的个数,简单明朗
还有一种和这个类似,第一次在0到53之间生成一个随机数randomNum,将其(arr[randomNum])作为下标和数组最后一个(arr[53])互换位置;然后缩小随机范围,在0到52之间随机一个数字将其作为下标arr[randomNum]和arr[52]互换位置,经过54次交换也可以达到乱序效果。
//从后往前缩小随机范围,将每一次随机到的值以此从后往前存放,固定循环次数void MyShuffl_CutRange(int arr[], int num){//初始化随机数生成器种子srand(time(NULL));int pos,temp = 0;unsigned int size = num;for (int idx = num-1; idx >= 0; idx--){pos = rand() % size--;if (pos != idx){temp = arr[pos];arr[pos] = arr[idx];arr[idx] = temp;}}}
- 洗牌算法多种形式
- 完美洗牌算法的多种实现
- 洗牌算法
- 洗牌算法
- 洗牌算法
- 洗牌算法
- 洗牌算法
- 洗牌算法
- 洗牌算法
- 洗牌算法
- 洗牌算法
- 洗牌算法
- 洗牌算法
- 洗牌算法
- 洗牌算法
- 洗牌算法
- 洗牌算法
- 洗牌算法
- 【小蒙淘金】2.24周评-黄金白银下周行情走势预估
- Intel Haswell的事务内存分析
- JDK工具之 jps命令
- Linux rpm 命令参数使用详解[介绍和应用]
- 三维显示软件制作--显示部分(4)
- 洗牌算法多种形式
- ubuntu 10.04下成功编译Qtopia2.2.0
- (转载) UITableView 系列一 :基本使用方法 (显示,删除,添加图片,添加样式等
- C# 小程序之新手练习(三)数组模拟约瑟夫环
- LeeCode27:Implement strStr()
- 分享一位软件工程师的7年总结
- 异步消息的传递-回调机制
- Objective C的学习之HelloWorld
- 【学习笔记】python版选择排序和插入排序及时间复杂度分析