博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Erlang list shuffle
阅读量:7052 次
发布时间:2019-06-28

本文共 698 字,大约阅读时间需要 2 分钟。

hot3.png

    前一段时间,有同事问Erlang中如何实现将一个列表中元素打乱,我第一反应就是每次根据列表长度随机出一个下标,将该元素剔出列表,加入到新列表中,重复上面步骤至原列表为空即可。没过多久一个同事说,直接给每个元素一个随机值,然后排序一下就可以了。其实游戏中经常会遇到这种需要打乱顺序的情况,例如洗牌,网上搜寻了一番,发现了些做法。

参考  中的

版本1(速度快,随机化不好):

shuffle_v1(L) ->List1 = [{random:uniform(), X} || X <- L],List2 = lists:keysort(1, List1),[E || {_, E} <- List2].

上面的版本2 代码不少,是叫Fisher-Yates shuffle算法,根据中描述,跟我开始想的方法差不多,但原算法涉及到数组的元素交换,我个人感觉erlang的list在这方面不太方便,果然有更加简洁的方案,

shuffle(List) -> shuffle(List, []).shuffle([], Acc) -> Acc;shuffle(List, Acc) ->{Leading, [H | T]} = lists:split(random:uniform(length(List)) - 1, List),shuffle(Leading ++ T, [H | Acc]).

 当然原算法进行数组的元素交换,只需要一个临时变量即可完成随机数组的生成,特别当数组长度很大的情况下,能节省不少内存。

转载于:https://my.oschina.net/rongtou/blog/81254

你可能感兴趣的文章
实验三 有限自动机的构造与识别
查看>>
python的学习笔记之——time模块常用内置函数
查看>>
计算机是如何工作的
查看>>
【c++】必须在类初始化列表中初始化的几种情况
查看>>
阿拉伯数字1与英语字母l造成的代码bug
查看>>
深度学习常见的专业术语
查看>>
2018-2019-2 20165334《网络对抗技术》Exp2 后门原理与实践
查看>>
vue双向数据绑定最最最最最简单直观的例子
查看>>
HTML提交方式post和get区别(实验)
查看>>
Java 11.do语句
查看>>
学习理论之感知器与最大间隔分类器
查看>>
我们建了一个 Golang 硬核技术交流群(内含视频福利)
查看>>
Be Nice!要善良
查看>>
二、ansible配置简要介绍
查看>>
解决docker容器中无ifconfig命令和ping命令问题
查看>>
CHAR、TCHAR、WCHAR_T之间的区别与问题
查看>>
sql小计合计
查看>>
安装Java
查看>>
Ubuntu Linux输入法fcitx方块乱码解决设置
查看>>
node递归批量重命名指定文件夹下的文件
查看>>