首頁 php教程 php手册 erlang乱序一个List的方案

erlang乱序一个List的方案

Jun 13, 2016 am 10:55 AM
erlang list 亂序 方案 目前 系統

最近在系统地看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>   

 

 

有几点值得思考的,关于这两种方案,是否是真正的洗牌算法。每个数字出现在某个位置是否等概率呢。

还有其它的方法不,欢迎探讨。

 

 

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

CUDA之通用矩陣乘法:從入門到熟練! CUDA之通用矩陣乘法:從入門到熟練! Mar 25, 2024 pm 12:30 PM

CUDA之通用矩陣乘法:從入門到熟練!

华为乾崑 ADS3.0 智驾系统 8 月上市 享界 S9 首发搭载 华为乾崑 ADS3.0 智驾系统 8 月上市 享界 S9 首发搭载 Jul 30, 2024 pm 02:17 PM

华为乾崑 ADS3.0 智驾系统 8 月上市 享界 S9 首发搭载

蘋果16系統哪個版本最好 蘋果16系統哪個版本最好 Mar 08, 2024 pm 05:16 PM

蘋果16系統哪個版本最好

常用常新!華為Mate60系列升級HarmonyOS 4.2:AI雲端增強、小藝方言太好用了 常用常新!華為Mate60系列升級HarmonyOS 4.2:AI雲端增強、小藝方言太好用了 Jun 02, 2024 pm 02:58 PM

常用常新!華為Mate60系列升級HarmonyOS 4.2:AI雲端增強、小藝方言太好用了

主機板上的數位音訊輸出介面-SPDIF OUT 主機板上的數位音訊輸出介面-SPDIF OUT Jan 14, 2024 pm 04:42 PM

主機板上的數位音訊輸出介面-SPDIF OUT

電腦作業系統有哪些 電腦作業系統有哪些 Jan 12, 2024 pm 03:12 PM

電腦作業系統有哪些

Linux與Windows系統中cmd指令的差異與相似之處 Linux與Windows系統中cmd指令的差異與相似之處 Mar 15, 2024 am 08:12 AM

Linux與Windows系統中cmd指令的差異與相似之處

Oracle資料庫中修改系統日期方法詳解 Oracle資料庫中修改系統日期方法詳解 Mar 09, 2024 am 10:21 AM

Oracle資料庫中修改系統日期方法詳解

See all articles