在项目中需要对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.
分享到:
相关推荐
这时就需要以相同的顺序打乱两个list,那么在python中如何实现呢?可以通过设置相同的随机种子,再shuffle的方式来实现。 代码如下: import random randnum = random.randint(0,100) random.seed(randnum)
今天小编就为大家分享一篇Python使用random.shuffle()打乱列表顺序的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
public static void shuffle(List<?> list, Random r) { int size = list.size(); if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) { for (int i=size; i>1; i--) list.set(i, list.set(random....
random.shuffle(dessert) print(dessert) 运行结果如下: 注:列表打印出来是洗牌后的结果,顺序完全不一样。如果写一个牌类游戏,可以用这个功能来对一个代表一副牌的列表洗牌。 以上这篇在Python中实现
public static void shuffle(List<?> list, Random random) { // ... for (int i = list.size() - 1; i > 0; i--) { int index = random.nextInt(i + 1); if (index ) { index = -index; } // 交换元素 swap...
random.shuffle(my_list) print(my_list) # 输出例如 [2, 1, 5, 4, 3] ``` #### 7. `random.sample(seq, k)` 此函数用于从序列 `seq` 中随机选择 `k` 个不重复的元素,返回一个新的列表。例如: ```python import...
2. static void shuffle(List<?> list, Random rand):使用指定的随机源对列表进行置换,所有置换发生的可能性都是大致相等的,假定随机源是公平的。 这些方法的目的都是将列表的元素进行随机排列,以便于实现洗牌...
除了`ArrayList`,对于其他类型的集合如`LinkedList`或`HashSet`,在打乱顺序前需要先转换为`List`,因为`Collections.shuffle()`只适用于`List`接口的实现。例如: ```java Set<Integer> set = new HashSet(); set....
代码 复制代码 代码如下: #!/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]
`random.shuffle(list)`函数用于将列表中的元素随机打乱。此函数仅适用于列表类型,如果尝试将其应用于字符串,则会引发错误。 ```python import random item = [1, 2, 3, 4, 5, 6, 7] print(item) # 输出:[1, 2, 3...
- 使用`Math.random()`生成一个0到1之间的随机浮点数,然后乘以`list`的大小,向下取整得到一个随机索引`random`。 - 检查`random`是否已经在`map`中,如果不在,将`random`添加到`map`中,并将对应的元素添加到`...
### 洗牌算法概述 #### 一、概念介绍 ...无论是使用自定义的Fisher-Yates算法还是Python标准库中的`random.shuffle()`函数,都可以有效地实现数据的随机重排。选择合适的方法取决于具体的需求和场景。
在Python3中,`shuffle`函数是`random`模块的一部分,用于对列表中的元素进行原地随机排序,即不创建新的列表而是直接修改原有列表。理解`shuffle`函数的使用和注意事项是编写涉及随机化处理代码的关键。 首先,...
random.shuffle(my_list) print(my_list) selected_elements = random.sample(my_list, 3) print(selected_elements) ``` 在“Random_no-master”这个压缩包文件中,可能包含了关于随机数生成的示例代码、教程或者...
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姓名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_yates_shuffle(my_list) print(my_list) ``` 在这个实现中,`fisher_yates_shuffle`函数接受一个列表`arr`作为参数。算法从列表的最后一个元素开始,通过生成一个随机索引`j`(在当前元素的索引范围内),...
Collections.shuffle(cards, new Random()); } public Card deal() { return cards.remove(0); } // Other methods like checking if deck is empty... } ``` 现在我们有了扑克牌的基础,可以开始设计游戏...