`
litaocheng
  • 浏览: 337126 次
  • 性别: 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()打乱列表顺序的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    Collections 随机排序方法Shuffle源码说明

    public static void shuffle(List&lt;?&gt; list, Random r) { int size = list.size(); if (size &lt; SHUFFLE_THRESHOLD || list instanceof RandomAccess) { for (int i=size; i&gt;1; i--) list.set(i, list.set(random....

    在Python中实现shuffle给列表洗牌

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

    Java中 shuffle 算法的使用

    public static void shuffle(List&lt;?&gt; list, Random random) { // ... for (int i = list.size() - 1; i &gt; 0; i--) { int index = random.nextInt(i + 1); if (index ) { index = -index; } // 交换元素 swap...

    「Python系列」Python random模块、hashlib模块.md

    random.shuffle(my_list) print(my_list) # 输出例如 [2, 1, 5, 4, 3] ``` #### 7. `random.sample(seq, k)` 此函数用于从序列 `seq` 中随机选择 `k` 个不重复的元素,返回一个新的列表。例如: ```python import...

    Collections.shuffle()方法实例解析

    2. static void shuffle(List&lt;?&gt; list, Random rand):使用指定的随机源对列表进行置换,所有置换发生的可能性都是大致相等的,假定随机源是公平的。 这些方法的目的都是将列表的元素进行随机排列,以便于实现洗牌...

    Java 实例 - 集合打乱顺序源代码-详细教程.zip

    除了`ArrayList`,对于其他类型的集合如`LinkedList`或`HashSet`,在打乱顺序前需要先转换为`List`,因为`Collections.shuffle()`只适用于`List`接口的实现。例如: ```java Set&lt;Integer&gt; set = new HashSet(); set....

    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]

    Python随机数用法实例详解【基于random模块】

    `random.shuffle(list)`函数用于将列表中的元素随机打乱。此函数仅适用于列表类型,如果尝试将其应用于字符串,则会引发错误。 ```python import random item = [1, 2, 3, 4, 5, 6, 7] print(item) # 输出:[1, 2, 3...

    java list随机抽取元素的案例

    - 使用`Math.random()`生成一个0到1之间的随机浮点数,然后乘以`list`的大小,向下取整得到一个随机索引`random`。 - 检查`random`是否已经在`map`中,如果不在,将`random`添加到`map`中,并将对应的元素添加到`...

    python洗牌算法.md

    ### 洗牌算法概述 #### 一、概念介绍 ...无论是使用自定义的Fisher-Yates算法还是Python标准库中的`random.shuffle()`函数,都可以有效地实现数据的随机重排。选择合适的方法取决于具体的需求和场景。

    在python3中使用shuffle函数要注意的地方

    在Python3中,`shuffle`函数是`random`模块的一部分,用于对列表中的元素进行原地随机排序,即不创建新的列表而是直接修改原有列表。理解`shuffle`函数的使用和注意事项是编写涉及随机化处理代码的关键。 首先,...

    Random_no

    random.shuffle(my_list) print(my_list) selected_elements = random.sample(my_list, 3) print(selected_elements) ``` 在“Random_no-master”这个压缩包文件中,可能包含了关于随机数生成的示例代码、教程或者...

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

    random.shuffle(full_list) # 切分数据 sublist_1 = full_list[:offset] sublist_2 = full_list[offset:] return sublist_1, sublist_2 ``` 这个`split`函数接受三个参数: 1. `full_list`:要切分的完整...

    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 ); ...

    Fisher代码实现.zip

    fisher_yates_shuffle(my_list) print(my_list) ``` 在这个实现中,`fisher_yates_shuffle`函数接受一个列表`arr`作为参数。算法从列表的最后一个元素开始,通过生成一个随机索引`j`(在当前元素的索引范围内),...

    java实现扑克牌游戏

    Collections.shuffle(cards, new Random()); } public Card deal() { return cards.remove(0); } // Other methods like checking if deck is empty... } ``` 现在我们有了扑克牌的基础,可以开始设计游戏...

Global site tag (gtag.js) - Google Analytics