当前位置: 首页 > 面试题库 >

使用Python random.shuffle随机播放的列表的最大长度?

阎丰
2023-03-14
问题内容

我有一个列表,可以使用内置的shuffle函数(random.shuffle)进行shuffle

但是,Python参考指出:

请注意,即使很小len(x),x的排列总数也比大多数随机数生成器的周期大。这意味着长序列的大多数排列永远不会生成。

现在,我想知道这个“相当小的len(x)”是什么意思。100、1000、10000,…


问题答案:

TL; DR:它在包含2080多个元素的列表上“断开”,但是不必太担心:)

完整答案:

首先,请注意,“改组”列表可以(在概念上)理解为生成列表元素的所有可能排列,并随机选择这些排列之一。

然后,您必须记住,所有独立的计算机化随机数生成器实际上都是“伪”随机数。也就是说,它们实际上并不是随机的,而是依靠一系列因素来尝试生成难以被高级或有目的地复制的数字。这些因素中通常是先前生成的数字。因此,在实践中,如果连续使用一定次数的随机数生成器,最终将再次从头开始获得相同的序列(这是文档所指的“期间”)。

最后,Lib / random.py(随机模块)上的文档字符串说:“(随机数生成器)的周期是2**19937-1。”

因此,考虑到所有这些,如果您的列表中存在2**19937多个或更多的排列,那么其中一些将永远无法通过对列表进行混排获得。您(再次,从概念上来说)将生成列表的所有排列,然后生成一个随机数x,然后选择第x个排列。下次,您将生成另一个随机数y,并选择yth排列。等等。但是,由于排列的数量多于获得随机数的数量(因为最多在2**19937-1生成数字之后,您将再次开始获得相同的数量),因此您将再次开始选择相同的排列。

因此,您看到,列表的长度不完全是问题(尽管确实会进入等式)。另外,2**19937-1是相当长的数字。但是,根据您的洗牌需求,您应该牢记所有这些。在简单的情况下(并具有快速的计算功能),对于没有重复元素的列表,2081个元素将产生2081!置换,大于2**19937



 类似资料:
  • 问题内容: 我尝试使用Streams API将以下Scala行转换为Java 8: 为了用Java编写等效项,我创建了一个整数范围: 我怀疑在流API中找到了一个方法,但只知道奇怪的方法: 如何使用Java 8 Streams API随机播放列表? 问题答案: 干得好: 印刷品:

  • 我正在wordpress网站上嵌入Spotify播放列表。嵌入播放列表很简单;尽管我在创建“跟随播放列表”按钮时遇到问题。我在这里浏览了SpotifyAPI文档:SpotifyAPI 我请求授权,得到了OAuth令牌。 根据我所读到的,我假设我需要创建一个html链接目标,例如: (这不起作用) 或 (我不知道该怎么办) 这是我尝试嵌入的示例播放列表:这是我尝试获取以下代码的示例播放列表:DJ T

  • 问题内容: 我有一个清单: 使用javascript,如何随机重新排列列表项? 问题答案: var ul = document.querySelector(‘ul’); for (var i = ul.children.length; i >= 0; i–) { ul.appendChild(ul.children[Math.random() * i | 0]); }

  • 我正在尝试在iOS设备上播放.pls音频流,但它似乎不工作,这是我当前正在做的;

  • 问题内容: 我有以下DataFrame: 从csv文件读取DataFrame。所有具有1的行都位于最上面,然后是具有2的行,然后是具有3的行,依此类推。 我想重新整理DataFrame行的顺序,以便将所有行混合在一起。可能的结果可能是: 我该如何实现? 问题答案: 使用Pandas的惯用方式是使用数据框的方法对所有行进行采样而无需替换: 的关键字参数指定的行的分数到随机样品中返回,所以装置返回所有

  • 我已经创建了一个非常简单和基本的html5音频播放器,实际上不超过: 但我面临两个问题,这个简单的音频标签在Chrome上可以使用,但在Safari 7上不行;第二个问题是,它不能在我的iPhone iOS7和HTC Android 2.3上使用