当前位置: 首页 > 知识库问答 >
问题:

随机置换迭代算法

逄征
2023-03-14

我有一个包,有以下内容:

  • 6颗红色大理石

我想从袋子里取出一个随机的弹珠,记录它的颜色,然后重复,直到袋子里不再剩下弹珠:

  • 排序计数
    • 包={2:蓝色,5:绿色,6:红色}
    • 累计={2:蓝色,7:绿色,13:红色}
    • 兰德(0,13)=3
    • i=1
    • 绿色的
    • 袋子={2:蓝色,4:绿色,6:红色}

    这是一种很好的方法,还是在时间复杂度方面有更有效的方法?

共有2个答案

乐成济
2023-03-14

您可以就地打乱数组,而不是依赖于提取。

>

  • 就像在马拉卡的回答中一样,您将项目单独存储在数组中(这里引用它:“创建一个包含所有项目的列表(0=红色,1=绿色,2=蓝色):[0,0,0,0,0,0,0,1,1,1,1,1,2]。)

    遍历数组,为每个元素i,选择要交换位置的元素的随机索引j

    最后,只需在数组上迭代即可得到一个无序顺序。

    差不多

    for(i=0..len-1) {
      j=random(0..len-1);
      // swap them
      aux=a[i]; a[i]=a[j]; a[j]=aux;
    }
    // now consume the array - it is as random as it can be
    // without extracting from it on the way
    

    注意:许多编程语言将有库提供已经实现的数组/列表洗牌功能

    >

    Java-集合。洗牌

    Python——随机。洗牌

  • 唐宏壮
    2023-03-14

    你的算法很好,但可以进一步优化:

    >

  • 你不需要对颜色进行排序!你可以跳过第一步。

    与每次计算累积计数不同,您可以通过减少选定颜色(包括选定颜色本身)右侧的所有值来迭代计算累积计数。

    您也不需要进行二进制搜索,只需从末尾开始减少累积计数,直到达到正确的数字。

    还有另一种基于列表的算法:

    >

  • 创建包含所有项目(0=红色,1=绿色,2=蓝色)的列表:[0,0,0,0,0,0,1,1,1,1,1,2,2]。

    获取一个介于0和list-1大小之间的随机整数i。

    从列表中删除第i项并将其添加到结果中。

    重复2次。三,。直到列表为空。

  •  类似资料:
    • 问题内容: 当您要依次遍历数字列表时,您将编写: 但是,如果要随机遍历范围(0..999)的数字列表怎么办?需要(在每个迭代中)随机选择在任何先前迭代中未选择的数字,并且需要对范围(0..999)内的所有数字进行迭代。 你知道该怎么做(聪明)吗? 问题答案: 您可以习惯随机播放列表: 顺便说一句,在许多情况下,您将在其他编程语言中使用整数范围内的循环,则可以直接描述要在Python中迭代的“事物”

    • 问题内容: 似乎是一个非常基本的问题。我有一个,我想对其进行迭代。一般, 绝招。但是我的要求不是迭代,而是随机地。 问题答案: 您可以在列表中使用。 请注意,这将随机排列列表,因此,如果顺序很重要,则应制作一个副本(并随机排​​列副本)。 或者,您可以创建一个包含元素的随机数组,并使用这些元素作为索引来访问中的“随机”元素。

    • 我正在尝试使用For循环将一个随机整数(0-2)添加到一个变量中指定的次数。我遇到的问题是,循环不是每次循环时都使用一个新的随机数,所以,如果我输入9,我只能得到0、9,或者18。 我希望一个对象返回的键“a”和“b”具有不同的数值。

    • 问题内容: 我可以依靠地图的随机迭代顺序在Web应用程序中实现客户端的随机“配对”吗?我试过环顾四周,但似乎找不到这种随机性有多大的细分。 该算法将类似于: 当连接的客户端> 1000个时,这是否足够?还是应该维护一个单独的客户端片段并从中随机选择? 问题答案: 尽管它说是随机的(随机的)(spec,blog,hashmap源,另一个blog,SO),但分布远非完美。 为什么?因为我们喜欢地图 快

    • 问题内容: 我有一个HashMap,每次我获得迭代器时,我都希望以不同的随机顺序迭代它们的键值对。从概念上讲,我想在调用迭代器之前对地图进行“混洗”(或者,如果需要,可以对迭代器进行“混洗”)。 我有两种选择: 1)使用LinkedHashMap的方法,并在内部保留条目列表,将其随机洗净,并在调用迭代器时返回该视图。 2)使用map.entrySet(),构造一个ArrayList并在其上使用sh

    • 问题内容: 和之间有什么区别? 我已经阅读了文档页面,但是当我只想随机地对数组元素进行随机排列时,我不明白两者之间是否有任何区别。 确切地说,假设我有一个数组。 如果我想生成x的随机排列,那么和之间有什么区别? 问题答案: 与以下内容有两个区别: 如果传递了数组,它将返回该数组的改组后的 副本 ;将数组改组到位 如果传递一个整数,它将返回一个改组范围,即 如果x是整数,则随机置换np.arange