您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息

erlang乱序一个List的方案_PHP教程

2024/3/29 15:35:18发布5次查看
最近在系统地看erlang,目前以《erlang programming》为学习材料,看完前面七八章,试图写点东西,发现手足无措,能找到帮助的资料和文档也非常少。
其实我希望有人能一起来学习或讨论。
今日题目: 乱序一个list.
方法一: 一个较为精巧的乱序方案。
[php]  
-module(shuffle).  
-export([do/1]).
do(l) ->  
    len = length(l),                      
    nl = lists:map(fun(x) -> {random:uniform(len), x} end, l),  
    nll = lists:sort(nl),                 
    [ v || {_,v}
其实这个问题挺困扰我的,变量一旦被赋值便不可修改,这个特性让原本写程序的想法和思路完全不同了。我上面的做法是,利用随机数生成一个[{rand1,elem1},...,{randn,elemn}]这样的列表。
然后再用sort排序后,重新打印出elem出来,乱序的效果由此达到。
结果大概如下:
[php]  
45> c(shuffle).               
{ok,shuffle}  
46> shuffle:do([1,2,3,4,5]).  
[4,5,1,2,3]  
47> shuffle:do([1,2,3,4,5]).  
[2,1,5,3,4]  
48> shuffle:do([1,2,3,4,5]).  
[3,1,2,4,5]  
49> shuffle:do([1,2,3,4,5]).  
[1,5,2,3,4]  
50> shuffle:do([1,2,3,4,5]).  
[5,1,4,3,2]  
51>
方法二:通用洗牌算法
 接上文,乱序一个list,我想原有的通用洗牌算法可行的。尝试写了另一个函数。经测试有效,但是我想肯定有优化的空间。代码的风格仍然透露着浓重的过程式思想吧。
%使用洗牌算法的方案                     
[php]  
do2(l) ->   
    do2(l,[]).
do2([],l) ->  
    l;  
do2(l1,l2) ->  
    %io:format(l1=~w   l2=~w~n,[l1,l2]),     
    len = length(l1),                     
    if   
        len > 1 ->   
            nl = lists:split(random:uniform(len-1), l1),  
            {[h1|t1],[h2|t2]} = nl,       
            nl2 = lists:flatten([t1],[h1|t2]),         
            l11 = lists:append(l2,[h2]),  
            do2(nl2, l11);  
        true ->  
            do2([],lists:append(l2,l1))  
    end.
其结果为:  
128> c(shuffle).  
{ok,shuffle}  
129> shuffle:do2(lists:seq(0,9)).  
[9,2,5,1,8,0,7,3,6,4]  
130> shuffle:do2(lists:seq(0,9)).  
[8,3,6,5,7,4,9,0,2,1]  
131> shuffle:do2(lists:seq(0,9)).  
[5,3,7,8,1,9,0,6,2,4]  
132> shuffle:do2(lists:seq(0,9)).  
[3,0,5,2,1,6,8,4,9,7]  
133>
有几点值得思考的,关于这两种方案,是否是真正的洗牌算法。每个数字出现在某个位置是否等概率呢。
还有其它的方法不,欢迎探讨。
http://www.bkjia.com/phpjc/477638.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/477638.htmltecharticle最近在系统地看erlang,目前以《erlang programming》为学习材料,看完前面七八章,试图写点东西,发现手足无措,能找到帮助的资料和文档也...
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录