洗牌算法多种形式

来源:互联网 发布:淘宝助理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;}}}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 做为小领导同事不听你的怎么办 二年级的小孩叫写作业不听怎么办 苹果手机微信出现黑框怎么办 百度网盘下载原画视频会闪退怎么办 已发布的公众号推文段落重复怎么办 谷歌商店找不到方舟手游怎么办 染头发的颜色弄到衣服上怎么办 橡皮把桌面油漆弄掉了怎么办 手机被调成静音不知道放哪了怎么办 金丝熊吃大米吃撑了怎么办 部落有可疑记录被暂时禁封怎么办 鼻子通向嘴那里痒得难受怎么办 小孩上嘴唇中间的连线碰掉了怎么办 秋田犬夏天退毛严重么 怎么办 初中数学基本没学过高中怎么办 老师家纺突然想日语文老师怎么办 微信聊天表情小企鹅不动了怎么办 微信自带小表情不全怎么办 爱奇艺电视果有图像无声音怎么办 微信表情包保存不到手机相册怎么办 才出生的兔宝宝被母兔抓伤了怎么办 老婆生气了说恨我一辈子我该怎么办 华为手机微信表情不显示含义怎么办 地下城游戏登录链接一直失败怎么办 聊天时别人打听家人不想回答怎么办 微信钱包零钱密码忘了怎么办 斗图我能怎么办我也很无奈 微信解冻设备不一致申诉失败怎么办 看不懂微信脸部表情什么意思怎么办 有的动图图片过大微信发不了怎么办 微信漂流瓶扔瓶子没有人回复怎么办 删了微信 手贱 添加 怎么办 姨妈弄到床垫上拆不下来洗怎么办 碰到情商智商都高的小人怎么办 微信聊天界面右上角的小人头怎么办 最近摸高摸到的高度越来越矮怎么办 每次孕检显示小孩子体型大怎么办? 阴阳师纸片人蓝色锦囊点掉了怎么办 抱孩子把腰闪了动不了在家怎么办 餐厅客人中有儿童服务时怎么办 脊柱胸段向右侧凸要怎么办