程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> erlang亂序一個List的方案

erlang亂序一個List的方案

編輯:關於PHP編程

最近在系統地看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} <- NLL].       其實這個問題挺困擾我的,變量一旦被賦值便不可修改,這個特性讓原本寫程序的想法和思路完全不同了。我上面的做法是,利用隨機數生成一個[{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>        有幾點值得思考的,關於這兩種方案,是否是真正的洗牌算法。每個數字出現在某個位置是否等概率呢。 還有其它的方法不,歡迎探討。    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved