`
litaocheng
  • 浏览: 333206 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

list random shuffle实现

阅读更多
在项目中需要对list进行随机shuffle,但是在erlang的stdlib中没有这个函数。
因此需要自己实现一把。
参考google两种实现:

版本1(速度快,随机化不好):
shuffle_v1(L) ->       
        List1 = [{random:uniform(), X} || X <- L],
        List2 = lists:keysort(1, List1),
        [E || {_, E} <- List2].

很简单为每个元素添加一个random的次序,随后通过sort进行排序,最后获取最终结果。


版本2(速度慢,随机化好):
采用:Fisher-Yates shuffle
参考:http://www.itl.nist.gov/div897/sqg/dads/HTML/fisherYatesShuffle.html

shuffle_v2([]) ->
    [];
shuffle_v2(L = [_]) ->
    L;
shuffle_v2(L) ->
    shuffle1(1, L, length(L)).

shuffle1(Len, L, Len) ->
    L;
shuffle1(Cur, L, Len) ->
    S = Cur + round((Len - Cur) * random:uniform()),
    L2 = swap_element(L, Cur, S),
    shuffle1(Cur + 1, L2, Len).

swap_element(L, N, N) ->
    L;
swap_element(L, N1, N2) ->
    Z = lists:zip(lists:seq(1, length(L)), L),
    {value, E1} = lists:keysearch(N1, 1, Z),
    {value, E2} = lists:keysearch(N2, 1, Z),
    Z2 = lists:keyreplace(N1, 1,
                    lists:keyreplace(N2, 1, Z, E1),
                    E2),
    {_, Result} = lists:unzip(Z2),
    Result.

一句话描述算法:
Randomly permute N elements by exchanging each element ei with a random element from i to N. It consumes Θ(N log N) bits and runs in linear time.
分享到:
评论
2 楼 fxsjy 2009-06-18  
@wangyuantao,正解,算法导论上有讲。
1 楼 wangyuantao 2009-06-10  
1)
S = Cur + round((Len - Cur) * random:uniform()),
应改成
S = random:uniform(Len - Cur + 1) + Cur - 1,
否则计算结果不对!

2)
可以严格证明,shuffle_v1和shuffle_v2产生的随机序列联合分布相同,因此无所谓“随机性”好坏。
理论上虽然shuffle_v1的复杂度O(nlogn),shuffle_v2的复杂度O(n)(如果swap复杂度是O(1)),但是实验发现,v2的计算时间是v1的100倍以上。

相关推荐

    在python中以相同顺序shuffle两个list的方法

    这时就需要以相同的顺序打乱两个list,那么在python中如何实现呢?可以通过设置相同的随机种子,再shuffle的方式来实现。 代码如下: import random randnum = random.randint(0,100) random.seed(randnum)

    Python使用random.shuffle()打乱列表顺序的方法

    今天小编就为大家分享一篇Python使用random.shuffle()打乱列表顺序的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    在Python中实现shuffle给列表洗牌

    random.shuffle(dessert) print(dessert) 运行结果如下: 注:列表打印出来是洗牌后的结果,顺序完全不一样。如果写一个牌类游戏,可以用这个功能来对一个代表一副牌的列表洗牌。 以上这篇在Python中实现

    Python随机生成数模块random使用实例

    代码 复制代码 代码如下: #!/usr/bin/env python #coding=utf-8 import random #生成[0, 1)直接随机浮点数 ...random.shuffle(list) print list 输出 复制代码 代码如下: 0.787074152336 95 1 [4, 5, 2, 3, 1]

    perl_list_helpers_xs:该模块提供了几种方法来从数组中随机抽取和获取随机元素

    perl_list_helpers_xs姓名List::Helpers::XS - Perl extension to provide some usefull functions with arrays概要 use List::Helpers::XS qw/ :shuffle :slice / ; my @slice = random_slice(\ @list , $size ); ...

    python按比例随机切分数据的实现

    在机器学习或者深度学习中,我们常常碰到一个问题是数据集的切分。比如在一个比赛中,举办方给我们的只是一个带标注的训练集和不带标注的测试集。其中训练集是用于训练,而测试...def split(full_list,shuffle=False,r

    python中将两组数据放在一起按照某一固定顺序shuffle的实例

    有的时候需要将两组数据,比如特征和标签放在一起随机打乱, 但是又想记录...random.Random(100).shuffle(c) print(c) a, b = zip(*c) print(a) print(b) 输出: [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5),

    对python打乱数据集中X,y标签对的方法详解

    今天踩过的两个小坑: 一.用random的shuffle打乱数据集中的数据-标签对 ...去掉index=random.shuffle(index)等号前面的值,这样利用shuffle函数就可以直接将index的内容打乱,并且不返回任何值。 因此以

    控制台下变色龙扑克游戏

    public static System.Collections.ArrayList shuffle(System.Collections.ArrayList list)//洗牌 { System.Random r = new Random(); for (int i = 0; i ; i++) { int rightOrRight = r.Next(1, 3); Poker[]...

    php打乱数组二维数组多维数组的简单实例

    function shuffle_assoc($list) { if (!is_array($list)) return $list; $keys = array_keys($list); shuffle($keys); $random = array(); foreach ($keys as $key) $random[$key] = $list[$key]; return $...

    Python列表list常用内建函数实例小结

    &gt;&gt;&gt; random.shuffle(x) #打乱顺序 &gt;&gt;&gt; x [2, 4, 5, 9, 3, 7, 8, 0, 6, 1] &gt;&gt;&gt; max(x) #返回最大值 9 &gt;&gt;&gt; min(x) #返回最小值 0 &gt;&gt;&gt; sum(x) #所有元素之和 45 &gt;&gt;&gt; len(x) #所有元素个数 10 &gt;&gt;&gt; list(zip(x,[1]*10)) #...

    Python使用random和tertools模块解一些经典概率问题

    返回一个位于 sequence 中的元素,其中,sequence 为一个有序序列,如 list、string 或者 tuple 等类型; randrange([start], stop[, step]) 等效于 choice(range([start], stop[, step])); shuffle(sequ

    python实现获取序列中最小的几个元素

    本文实例讲述了python实现获取序列中最小的几个元素。分享给大家供大家参考。 具体方法如下: ...random.shuffle(alist) print 'the origin list is',alist print 'the min in the list is' for x

    Python3简单实例计算同花的概率代码

    每次抽取后都重新洗牌。计算10000次随机抽取可得到同花的几率。我做的比较复杂,分别累计了四种花色分别出现了几次 import random list=["2","3","4",'5','6','7','8','9','10',"J","Q",... random.shuffle(list3) l

    毕业设计-基于LW-AlexNet的猫狗图像分类(python)

    训练 ...--drop_list 是否丢弃多余的图 --shuffle 是否打乱图片 --save_csv 是否保存到csv文件 --random_seed 是否随机种子 --seed 指定种子的值 --learn_rate_decay 是否使用学习率衰减 --decay_rate

    Invent Your Own Computer Games with Python (2008).pdf

    The random.shuffle() Function x Tips for Inventing Your Own Games x Chapter 11 - AI Simulation x "Computer vs. Computer" Games x Percentages x Integer Division x The round() Function x Learning ...

    stl详解 包括各种实例代码

    8. random_shuffle 32 9. partition / stable_partition 33 10. sort / stable_sort 33 11. partial_sort 34 12. nth_element 34 13. lower_bound / upper_bound //要求区间有序 34 14. binary_search //要求有序...

    STL源码剖析.pdg

    6.7.7 random_shuffle 383 6.7.8 partial_sort / partial_sort_copy 386 6.7.9 sort 389 6.7.10 equal_range(应用于有序区间) 400 6.7.11 inplace_merge(应用于有序区间) 403 6.7.12 nth_element 409 6.7....

    STL 源码剖析(侯捷先生译著)

    6.7.7 random_shuffle 383 6.7.8 partial_sort / partial_sort_copy 386 6.7.9 sort 389 6.7.10 equal_range(应用于有序区间) 400 6.7.11 inplace_merge(应用于有序区间) 403 6.7.12 nth_element 409 6.7....

    Python3 菜鸟查询手册

    07.16 随机数函数 random() 函数.png 07.17 随机数函数 seed() 函数.png 07.18 随机数函数 shuffle() 函数.png 07.19 随机数函数 uniform() 函数.png 07.20 三角函数 acos() 函数.png 07.21 三角函数 asin() ...

Global site tag (gtag.js) - Google Analytics