最近在系统地看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>
有几点值得思考的,关于这两种方案,是否是真正的洗牌算法。每个数字出现在某个位置是否等概率呢。
还有其它的方法不,欢迎探讨。

技嘉的主板怎么设置键盘开机首先,要支持键盘开机,一定是PS2键盘!!设置步骤如下:第一步:开机按Del或者F2进入bios,到bios的Advanced(高级)模式普通主板默认进入主板的EZ(简易)模式,需要按F7切换到高级模式,ROG系列主板默认进入bios的高级模式(我们用简体中文来示范)第二步:选择到——【高级】——【高级电源管理(APM)】第三步:找到选项【由PS2键盘唤醒】第四步:这个选项默认是Disabled(关闭)的,下拉之后可以看到三种不同的设置选择,分别是按【空格键】开机、按组

1.处理器在选择电脑配置时,处理器是至关重要的组件之一。对于玩CS这样的游戏来说,处理器的性能直接影响游戏的流畅度和反应速度。推荐选择IntelCorei5或i7系列的处理器,因为它们具有强大的多核处理能力和高频率,可以轻松应对CS的高要求。2.显卡显卡是游戏性能的重要因素之一。对于射击游戏如CS而言,显卡的性能直接影响游戏画面的清晰度和流畅度。建议选择NVIDIAGeForceGTX系列或AMDRadeonRX系列的显卡,它们具备出色的图形处理能力和高帧率输出,能够提供更好的游戏体验3.内存电

广联达软件是一家专注于建筑信息化领域的软件公司,其产品被广泛应用于建筑设计、施工、运营等各个环节。由于广联达软件功能复杂、数据量大,对电脑的配置要求较高。本文将从多个方面详细阐述广联达软件的电脑配置推荐,以帮助读者选择适合的电脑配置处理器广联达软件在进行建筑设计、模拟等操作时,需要进行大量的数据计算和处理,因此对处理器的要求较高。推荐选择多核心、高主频的处理器,如英特尔i7系列或AMDRyzen系列。这些处理器具有较强的计算能力和多线程处理能力,能够更好地满足广联达软件的需求。内存内存是影响计算

List操作//从list头部插入一个值。$ret=$redis->lPush('city','guangzhou');//从list尾部插入一个值。$ret=$redis->rPush('city','guangzhou');//获取列表指定区间中的元素。0表示列表第一个元素,-1表示最后一个元素,-2表示倒数第二个元素。$ret=$redis->l

1:JSONArray转ListJSONArray字符串转List//初始化JSONArrayJSONArrayarray=newJSONArray();array.add(0,"a");array.add(1,"b");array.add(2,"c");Listlist=JSONObject.parseArray(array.toJSONString(),String.class);System.out.println(list.to

电脑100兆网口怎么变成千兆的要将电脑的100兆网口升级为千兆网口,一般需要按照以下步骤进行操作:1.确认网卡是否支持千兆网速:首先需要确认电脑上的网卡是否支持千兆以太网,如果不支持的话就无法实现将100兆网口提速至千兆。2.更换网线:要实现千兆网速,需要使用Cat5e或更高规格的网线,因为Cat5e网线可以支持千兆以太网,而对于100兆以太网来说则只需使用Cat5网线即可。3.更改网卡驱动程序:如果您的网卡支持千兆以太网,则需要更新网卡的驱动程序。可以前往网卡制造商的官方网站,下载并安装最新的

如何使用C#中的List.Sort函数对列表进行排序在C#编程语言中,我们经常需要对列表进行排序操作。而List类的Sort函数正是为此设计的一个强大工具。本文将介绍如何使用C#中的List.Sort函数对列表进行排序,并提供具体的代码示例,帮助读者更好地理解和应用该函数。List.Sort函数是List类的一个成员函数,用于对列表中的元素进行排序。该函数接

一、List接口简介List是一个有序的集合、可重复的集合。它是继承Collection接口,在List集合中是可以出现重复的元素,可以通过索引(下标)来访问指定位置的元素。二、List常用方法——voidadd(intindex,Obejctelement)方法1.voidadd(intindex,Obejctelement)方法是把element元素插入在指定位置,后面的元素往后移一个元素。2.voidadd(intindex,Obejctelemen


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

禅工作室 13.0.1
功能强大的PHP集成开发环境

SublimeText3汉化版
中文版,非常好用

SublimeText3 Linux新版
SublimeText3 Linux最新版

记事本++7.3.1
好用且免费的代码编辑器

Dreamweaver CS6
视觉化网页开发工具