您的位置:首页 > 编程语言 > Python开发

Erlang练习:洗牌算法——将一个序列打乱,类似于Python里面的shuffle函数。

2013-04-04 13:36 357 查看
问题的来源:

问题描述:假设有一个数组,包含n个元素。现在要重新排列这些元素,要求每个元素被放到任何一个位置的概率都相等(即1/n),并且直接在数组上重排(in place),不要生成新的数组。用 O(n) 时间、O(1) 辅助空间。

算法的证明:

来计算一下概率。如果某个元素被放入第i(1≤i≤n)个位置,就必须是在前
i - 1 次选取中都没有选到它,并且第 i 次选取是恰好选中它。其概率为:

pi=n−1n×n−2n−1×⋯×n−i+1n−i+2×1n−i+1=1n

可见任何元素出现在任何位置的概率都是相等的。

网上的资源:

http://www.gocalf.com/blog/shuffle-algo.html

http://coolshell.cn/articles/8593.html

Fisher_Yates算法的Erlang实现:

-module(shuffle).

-compile(export_all).

shuffle(L) ->
shuffle(list_to_tuple(L), length(L)).

shuffle(T, 0)->
tuple_to_list(T);
shuffle(T, Len)->
Rand = random:uniform(Len),
A = element(Len, T),
B = element(Rand, T),
T1 = setelement(Len, T,  B),
T2 = setelement(Rand,  T1, A),
shuffle(T2, Len - 1).

main()->
shuffle(lists:seq(1, 10)).


不足:Erlang里面对lists处理的函数有些不足,没有对下标为i的元素进行操作的函数,所以就将其转换为tuple进行处理了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐