Collections.shuffle() 真的足够随机吗?实际例子似乎否定了这个说法

2024-02-02

我有 1000 个独特的对象java.util.List,每个都引用一个图像,1000 个列表中的每个图像都是唯一的,现在我想对它们进行洗牌,以便我可以使用前 20 个对象并将它们呈现给网站用户。 然后,用户可以单击“随机播放”按钮,然后我再次从头开始检索 1000 张图像并再次调用shuffle()。 然而,似乎在 1000 个图像对象中,我经常在 20 个图像选择之间一次又一次地看到相同的图像。

好像有些不对劲,有什么更好的建议、建议吗?

我的代码很简单:

List<String> imagePaths = get1000Images();
Collections.shuffle(imagePaths);

int i = 0;
for (String path: imagePaths) {
  ... do something with the path ...
  i++;
  if (i >= 20) break;
}

我知道Collections.shuffle()分布良好: 例如,参见http://blog.ryanrampersad.com/2012/03/03/more-on-shuffling-an-array- Correctly/ http://blog.ryanrampersad.com/2012/03/03/more-on-shuffling-an-array-correctly/

然而,我只是有一种感觉,在 1000 张图像中的 20 张图像中,一遍又一遍地看到同一张图像的概率应该要小得多……

高度赞赏投入。


人的本性就是看到不存在的模式。许多人将行星和恒星的模式视为指导他们的生活。

PI 的前 1000 位数字中有六个连续的 9。这是否意味着 PI 的数字不是随机的?不。该模式不会再次出现,超出您的预期。

话虽如此,Random 并不是完全随机的,它会在 2^48 次调用后重复。 (它使用 48 位种子)这意味着不可能产生所有可能的long or double使用它。如果您想要更多随机性,可以将 SecureRandom 与 shuffle 结合使用。

听起来你想要的是这样的

List<String> imagePaths = new ArrayList<>();

// called repeatedly
if (imagePaths.size() <= 500) {
    imagePaths = get1000Images();
    Collections.shuffle(imagePaths);
}

for (String path: imagePaths.subList(0, 20)) {
  ... do something with the path ...
}

imagePaths = imagePaths.subList(20, imagePaths.size());

这将确保您在最近 500 次调用中不会看到相同的图像。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Collections.shuffle() 真的足够随机吗?实际例子似乎否定了这个说法 的相关文章

随机推荐

  • 何时使用 TaskEx.Run 与 TaskEx.RunEx

    I m trying to understand when to use TaskEx Run I have provided two code sample i wrote below that produce the same resu
  • 为什么 BigTable 有列族?

    为什么 BigTable 的结构是 family qualifier 的两级层次结构 具体来说 为什么要强制执行此操作 而不是仅仅拥有列 并建议用户将其限定符命名为 vertical column 我感兴趣的是强制执行此操作是否可以实现某些
  • 有没有办法在 Visual Studio 2019 中发布 .NET 标准库而不生成 .nupkg?

    我的理解是 当您发布 NET 标准库时 预期的行为是生成一个 nupkg 我有内部 Net 标准库 我维护这些库以供内部项目使用 典型的工作流程是发布库 然后将发布的文件复制到使用项目 这不是我应该做的事情吗 我对发布 NET 标准库时缺乏
  • MySQL的设置操作

    MySQL可以使用Set操作吗intersect and except 如果可以请举个例子 如果不能的话 该怎么操作呢 在mysql中可以使用intersect 但是你必须稍微不同地编写它 这是一个例子 和here http www bit
  • 尝试从 Bitbucket 迁移到 Github,出现文件大小错误

    我正在尝试从 bitbucket 迁移到 github 我所做的就是从远程删除 bitbucket 并添加我的 github 帐户 然后我尝试git push u origin master但我有一个large file detected错
  • MooTools 中的 .getScript() 等效项?

    我想知道是否有一个与 jQuery 等效的 MooTools getScript 我非常确定 MooTools 中存在该文件 但我还没有找到它 我对 MooTools 不太熟悉 但看起来你可以使用Asset javascript http
  • 将 float64 数组转换为 float32 数组

    我有一个 float64 数组 想要将每个值转换为 float32 我试过了 What I have features64 120 float64 What I ve tried features32 120 float32 feature
  • 如何从命令行构建android apk?

    如何从命令行构建 APK 文件 我试过了 MSBuild myProject dproj p Config Release p Platform Android 但不会生成 APK 文件 只生成 so 文件 一些实验表明 建议的各种行动方案
  • 在 TypeScript 中使用符号作为对象键类型

    我正在尝试用 a 定义一个对象symbol https developer mozilla org en US docs Web JavaScript Reference Global Objects Symbol作为 key type 因
  • #ifdef DEBUG 与 #if DEBUG

    当使用编译器指令时 我不清楚以下两个代码片段中哪一个是正确 首选以及原因 似乎我见过的大多数开发人员和开源项目都使用第一个 但我也看到第二个也经常使用 ifdef DEBUG self doSomethingOnlyWhenDebuggin
  • 为什么应该使用基于文档的数据库而不是关系数据库?

    为什么我应该使用基于文档的数据库 如 CouchDB 而不是使用关系数据库 是否存在基于文档的数据库比关系数据库更适合的典型应用程序或领域 也许你不应该 第二个最明显的答案是 如果您的数据不相关 则应该使用它 这通常表现为没有简单的方法将数
  • Vertx JDBC 客户端 queryWithParams - 如何添加列表?

    我有带条件的 SQL 查询currency in 我正在使用 vertx JDBC 客户端queryWithparams方法 它接收 JsonArray 中的查询参数 我怎样才能传递我的可能列表currency查询的值 我试过new Jso
  • 购物车 $_SESSION 问题

    我正在开发一个基本的购物车 但是 SESSION 变量似乎未正确存储或访问 例如 如果您前往它将显示项目名称 但是在没有任何 GET 变量的情况下刷新 cart php 时 它不会返回任何内容 我究竟做错了什么
  • 如何使用javascript或html打开手机chrome浏览器

    我有两个问题 我要这个 我想使用 javascript 或 html 在其他 Android 移动网络应用程序 例如 naver firefox 等 上打开带有 url 的 chrome 浏览器 所以例子 如果用户在移动网络应用程序上单击
  • 在一台机器上运行多个 MySQL 服务器

    我们可以在一台机器上运行多个 MySQL 服务器吗 Thanks 是的 您只需在单独的端口上运行它们并将它们指向不同的 lib 目录以获取其数据 这是一个很好的参考 http dev mysql com doc refman 5 1 en
  • ASP.NET C# 大文件上传时出现 OutofMemoryException

    我有以下文件上传处理程序 public class FileUploader IHttpHandler public void ProcessRequest HttpContext context HttpRequest request c
  • 如何在表过滤器中显示“未找到记录”消息

    我根据两个 tds 在我的桌子上应用过滤器 过滤器正在工作 但如果没有值匹配 我想显示 未找到记录 消息 这是一个示例演示 filter click function var tdScoring tdEarning var scoring
  • AttributeError:“NoneType”对象没有属性“dpi_scale_trans”

    通过 StackOverflow 检查我遇到的上述错误的可能解决方案后 我发现一些解决方案无法解决这个特定问题 下图显示了尝试在图上绘制多个轴时遇到的错误和获得的不需要的图 This is an image of the expected
  • 错误模板设计

    似乎我在这个网站上读到了关于这个问题的另一个问题 答案 但我不记得答案是什么 现在我找不到原始帖子 我不喜欢 WPF 中的默认错误模板 我了解如何更改此错误模板 但是 如果我将一些内容添加到文本框的末尾 则文本框的大小不会改变 并且添加的内
  • Collections.shuffle() 真的足够随机吗?实际例子似乎否定了这个说法

    我有 1000 个独特的对象java util List 每个都引用一个图像 1000 个列表中的每个图像都是唯一的 现在我想对它们进行洗牌 以便我可以使用前 20 个对象并将它们呈现给网站用户 然后 用户可以单击 随机播放 按钮 然后我再