随机排列列表中的元素(随机重新排列列表元素)

2024-04-03

我的程序的一部分要求我能够随机洗牌列表元素。我需要一个函数,当我给它一个列表时,它会伪随机地重新排列列表中的元素。
安排的改变Must每次通话时都可以看到相同的列表。

我的实现似乎工作得很好,但我觉得它相当长,并且正在增加我的代码库,而且,我有一种感觉,这不是执行此操作的最佳解决方案。所以我需要一个更短的实现。这是我的实现:



-module(shuffle).
-export([list/1]).
-define(RAND(X),random:uniform(X)).
-define(TUPLE(Y,Z,E),erlang:make_tuple(Y,Z,E)).

list(L)->    
    Len = length(L),
    Nums = lists:seq(1,Len),    
    tuple_to_list(?TUPLE(Len,[],shuffle(Nums,L,[]))).

shuffle([],_,Buffer)-> Buffer;
shuffle(Nums,[Head|Items],Buffer)->
    {Pos,NewNums} = pick_position(Nums),    
    shuffle(NewNums,Items,[{Pos,Head}|Buffer]).

pick_position([N])-> {N,[]};
pick_position(Nos)->
    T = lists:max(Nos), 
    pick(Nos,T).

pick(From,Max)->
    random:seed(begin
                    (case random:seed(now()) of 
                        undefined -> 
                            NN = element(3,now()),
                            {?RAND(NN),?RAND(NN),?RAND(NN)};
                        Any -> Any
                    end)
                end
                ),
    T2 = random:uniform(Max),
    case lists:member(T2,From) of
        false -> pick(From,Max);
        true -> {T2,From -- [T2]}
    end.
  

在 shell 中运行它:



F:\> erl
Eshell V5.8.4  (abort with ^G)
1> c(shuffle).
{ok,shuffle}
2> shuffle:list([a,b,c,d,e]).
[c,b,a,e,d]
3> shuffle:list([a,b,c,d,e]).
[e,c,b,d,a]
4> shuffle:list([a,b,c,d,e]).
[a,b,c,e,d]
5> shuffle:list([a,b,c,d,e]).
[b,c,a,d,e]
6> shuffle:list([a,b,c,d,e]).
[c,e,d,b,a]
  
I am motivated by the fact that in the STDLIB there is no such function. Somewhere in my game, i need to shuffle things up and also i need to find the best efficient solution to the problem, not just one that works.

Could some one help build a shorter version of the solution ? probably even more efficient ? Thank you

1> L = lists:seq(1,10).
[1,2,3,4,5,6,7,8,9,10]

通过创建元组列表 {R, X},将随机数 R 与 L 中的每个元素 X 相关联。对此列表进行排序并解压元组以获得 L 的打乱版本。

1> [X||{_,X} <- lists:sort([ {random:uniform(), N} || N <- L])].
[1,6,2,10,5,7,9,3,8,4]
2>     
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

随机排列列表中的元素(随机重新排列列表元素) 的相关文章

  • 有什么方法可以将 ActionScript 3 中的常规字符串转换为 Latin-1 字符代码的 ByteArray?

    我在将字符串转换为 UTF 16 编码字符的 byteArray 时没有问题 但我尝试与之通信的应用程序 用 Erlang 编写 仅理解 Latin 1 编码 有什么方法可以从 Actionscript 3 中的字符串生成充满 Latin
  • 具有大状态的 erlang gen_server

    我有一个包含数千个条目的特里树 用元组和列表实现 我想支持并发读取 数据的内存占用量在 10 20 MB 范围内 特里树被构建一次 之后只读 维护状态并为客户端提供并发访问的推荐方法是什么 这是我尝试过的 1 创建一个gen server
  • 基于代理/参与者的并发设计的设计模式[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 最近 我一直在研究支持参与者 代理 无共享架构的替代语言 即 scala clojure 等 clojure 也支持共享状态 到目前为止 我读过
  • 使用 OTP 原理的非阻塞 TCP 服务器

    我开始学习 Erlang 所以我尝试写 hello world 并发编程 IRC 机器人 我已经使用 Erlang 编写了一个 没有任何 OTP 细节 管理程序 应用程序等行为 我希望使用 OTP 原则重写它 但不幸的是我无法找出使用 OT
  • Erlang:如何从体内引用匿名函数?

    In Erlang http en wikipedia org wiki Erlang programming language 有没有办法引用当前正在执行的函数 这对于产生无限循环很有用 spawn fun gt do something
  • 加密 (cryptojs) - 解密 (erlang)

    我有一个使用 cryptoJS AES 加密的值 需要使用 Erlang 加密库进行解密 对我来说问题在于能够在 Erlang 中使用解密aes cbc 128 decrypt Key IVec Cipher 我想 我需要知道使用的 IVe
  • Erlang TCP 套接字关闭

    为了学习 Erlang 我正在尝试实现一个基于gen tcp 不幸的是 我的代码似乎触发了一些有线行为 为了演示这个问题 我附上了我的实现的最小化版本 它足以重现该问题 无论 HTTP 请求是什么 它都只是传递静态 200 OK 当我尝试运
  • 为什么使用erts_debug:size/1时atom的内存为零?

    I use erts debug size 1计算erlang VM中atom的内存 但我发现输出为零 谁能解释一下原因 7 gt erts debug size true 0 原因是原子与原子的数据一起保存在原子表中 因此整个节点中只有一
  • ejabberd如何编译新模块

    Here http www ejabberd im node 2872我找到了代码 erlc I ejabberd 2 1 13 lib ejabberd 2 1 13 include pa ejabberd 2 1 13 lib ejab
  • Erlang 17推荐使用地图替换记录,但是如何让mnesia支持地图?

    在 joe 的 Erlang 的重大改变 中http joearms github io 2014 02 01 big changes to erlang html http joearms github io 2014 02 01 big
  • 有没有办法对默认记录值进行查找?

    给定一个记录 record something id integer name string email undefined string undefined 有没有办法获取字段的默认值 在本例中得到的事实是 something email
  • 我们如何有效地处理 mnesia 记录的时间相关约束?

    我正在将记录写入mnesia 该记录应该保存在那里 仅在允许的时间 24 小时 内 24小时后 在用户修改其中的一部分之前 系统应该自动删除它们 例如 用户获得免费通话时间 用于语音通话 他们应该在给定时间内使用它们 如果他们不使用它 24
  • 在erlang中打印数字的每个数字的问题

    我正在尝试编写一个程序 该程序将读入一个数字 然后将该数字的每个数字输出到列表中 然而 在我尝试使用数字 8 和 9 之前 大多数事情看起来都很好 该程序仅输出 b t反而 如果输入的数字包含8或9 同时还有其他数字 例如283 就可以正常
  • 检查 Erlang 中的活动计时器

    有没有一种简单的方法来获取所有当前等待的计时器的列表erlang send after erlang apply after等在Erlang中 出于调试目的 您可以使用dbg 首先创建一个 ets 表来存储所有计时器引用 1 gt ets
  • 停止 Erlang 守护进程

    除了跑步 killall 9 beam smp 当我知道 Erlang 节点的情况时 如何以编程方式杀死它 sname 如果我不希望心跳监视器重新启动该进程 如何确保上述问题的任何答案也会终止心跳 有没有一个不错的指南来将 Erlang 部
  • 当通过 basho rebar 从命令行运行 Erlang 应用程序时,如何设置 Erlang 节点名称

    我已经使用 basho rebar 编译了我的 Erlang 应用程序 它生成了一个独立的 escript 可执行文件 我从命令行运行它 如下所示 myapp myconfig config 我的问题是如何确定运行我的应用程序的 Erlan
  • Erlang get_tcp:recv数据长度

    I user gen tcp recv Socket 0 用于数据接收 但我只能接收1次1418字节 我怎样才能收到发送的数据量 in gen tcp recv Socket 0 您正在询问内核 给我接收缓冲区中现在可用的所有数据 不过 内
  • Erlang Mnesia 中的分页搜索

    例如 给定记录 record item id time status 我想搜索 1000 到 1100 个项目 按时间和顺序排序status lt lt finished gt gt 有什么建议么 这取决于您的查询是什么样的 如果您需要按许
  • 在 digraph_utils:is_acirclic/1 返回 false 后查找循环或循环

    我怎样才能 有效地 在Erlang有向图中找到循环或循环digraph utils is acyclic 1返回假 EDIT is acyclic is 定义为 https github com erlang otp blob maint
  • Erlang 中的变量

    我有一个非常简单的 Erlang 程序 module test export start 0 Code Z00887 start gt io fwrite Code 我有以下两个错误 c erl6 1 dev test erl 4 之前的语

随机推荐

  • 学习 UML 的最佳来源是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 共享内存上的 spsc_queue

    我尝试了几个小时 这个问题几乎让我发疯 我想创建一个spsc queue在共享内存上 队列中的每个元素都是一个mq item t结构如下 typedef struct mq item t mq item type type union st
  • Eloquent 关系同步也会删除吗?

    更新模型并同步关系时 如果我不传入所有已存在的 id 该关系是否会被删除 你决定 sync有第二个参数 默认为true并负责分离 model gt relationship gt sync 1 2 3 model gt relationsh
  • 从 UIWebView 读取 HTML 内容

    是否可以读取已加载到的网页的原始 HTML 内容UIWebView 如果没有 是否有另一种方法可以从 iPhone SDK 中的网页提取原始 HTML 内容 例如 NET 的等效方法 WebClient openRead 第二个问题其实更容
  • Julia 多次调度失败

    v06 我想写一个需要 2 到 3 个参数的签名 第一个是整数或整数向量 第二个是整数向量或整数矩阵 第三个是整数向量或未指定 我第一次尝试是这样的 function foo a Union Integer Vector Integer b
  • Django 模型与管理器

    不太确定有什么区别 看起来 Manager 所做的只是拥有一堆与模型相关的功能 但这些功能也可以放在模型中 Django 文档对 Manager 的描述如下 Manager 是数据库查询操作的接口 提供给 Django 模型 那么 除了这个
  • 唯一导入*仅允许在模块级别[重复]

    这个问题在这里已经有答案了 我正在制作一个实用程序 其中内置了多个程序 但我对程序进行了一些更改 以便在用户提示时重新运行 然后由于某种原因 我面临错误 import only allowed at module level 这是我的代码
  • 打字稿错误:“请求”类型中不存在属性“用户”

    我的 Express 应用程序中有以下代码 router get auth userInfo this validateUser req res gt res json req user 我的 IDE 似乎在抱怨这个错误 错误 TS2339
  • 不同编译器中的 pure/const 函数属性

    pure是一个函数属性 表示函数不会修改任何全局内存 const是一个函数属性 表示函数不读取 修改任何全局内存 有了这些信息 编译器就可以进行一些额外的优化 海湾合作委员会示例 float sigmoid float x attribut
  • 无法从 android studio 中删除模拟器/avd?

    我一直在通过 Android Studio 运行 AVD 模拟器 它一直按预期工作 然而 模拟器 AVD 每次都开始崩溃 现在似乎处于损坏状态 我尝试通过 AS VDM 删除 AVD 但尝试执行此操作时会显示一条警报 其中包含以下错误消息
  • 将数据写入android中的远程文本文件

    如何将数据写入 android 中的远程文本文件 我可以读取文本文件的内容 但无法向其中写入数据 我的目标是将文本文件的内容更改为新文件 我使用 xampp 作为远程服务器 因为我家里没有互联网连接 这是我的代码 package com e
  • 如何滚动故事板预览?

    故事板有一个水平滚动条 供您滚动查看其他场景 但预览故事板场景时滚动条不存在 如何滚动故事板预览 假设我没有使用魔术鼠标 关于什么Shift Mouse Scroll 或者 如果您使用的是 Macbook 请在触控板上向左或向右滑动两根手指
  • 附加到 div 的 Bootstrap 箭头

    总的来说 我对引导程序和前端框架非常陌生 但是 我能够注意到使用 bootstrap 的网站的共同特征 下图包含我发现在引导网站中非常普遍的东西 指向其下方文本的向下 或任何方向 蓝色箭头也是我所指的 我使用 firebug 检查了这些元素
  • 如何从 svn 热复制备份中恢复

    我们当前的备份过程是每晚执行 SVN HOTCOPY 到另一台机器上的备份位置 我可以以某种方式从该备份中恢复并保留所有修订历史记录吗 或者我需要使用 svn dump load 吗 谢谢 钱德拉吉特 svnadmin hotcopy 实际
  • 纪元时间和 MySQL 查询

    我有一个这样的表 id date 1 1319043263 2 1319043578 纪元中的日期字段格式 我必须对属于同一天的每一行进行分组 并将它们显示在单独的组中 我怎样才能在 MySQL 中做到这一点 Thanks 通过 分组 SE
  • 如何阻止乌龟在提笔的情况下绘图?

    我正在Python中使用turtle模块 问题是 每当我让乌龟移动时 即使笔在上面 我也会画画 例如 如果我运行这个程序 import turtle turtle penup turtle goto 0 50 海龟移动到 0 50 时仍会画
  • C# with Unity 3D:当用户移动鼠标时如何使相机围绕对象移动

    我正在尝试在 Unity 4 中进行 3D 观看模拟 用户可以选择一个对象并移动鼠标围绕它旋转 360 度 我已经拍摄了很多镜头来尝试让它工作 但每次都失败 任何我们将不胜感激 如果它是用 C 编写的 那就太好了 但没必要 提前致谢 这是一
  • 以全高嵌入 PDF

    我的问题 是否可以将 PDF 嵌入到高度始终为 100 的 HTML 文档中 问题是 pdf 的实际高度可能会有所不同 布局需要对此做出响应 将 PDF 嵌入 HTML 的方法有多种 一种是使用PDF对象 http www pdfobjec
  • Fluent NHibernate 两级继承问题

    我希望在一个级别中为每种类型提供一个表 在另一级别中为层次结构提供一个表 是否可以 描述在这里 gt 我有这些课程 public class BaseItem public int Id get set public class Item
  • 随机排列列表中的元素(随机重新排列列表元素)

    我的程序的一部分要求我能够随机洗牌列表元素 我需要一个函数 当我给它一个列表时 它会伪随机地重新排列列表中的元素 安排的改变Must每次通话时都可以看到相同的列表 我的实现似乎工作得很好 但我觉得它相当长 并且正在增加我的代码库 而且 我有