【问题标题】:How to generate random number without repetition in java using hash function如何使用哈希函数在java中生成不重复的随机数
【发布时间】:2014-09-19 23:45:03
【问题描述】:

我想在我的 android 音乐播放器应用中添加随机播放选项。为此,我在 java 中调用一个随机函数来返回一个介于 0 和当前播放歌曲列表大小之间的数字。 问题是该函数返回与以前相同的值,并且在该值中发生重复。 堆栈溢出本身有很多解决方案可以避免这个问题。该解决方案以及以下解决方案不适用于我的情况。 1. 创建一个混洗数组包含 0 到最大列表大小值。它将失败,因为歌曲列表的大小是动态的。 2. 洗牌歌曲列表数组本身。由于时间复杂性,它将失败。

我需要的是一个数学哈希函数,它将执行以下操作..

如果 50 是最大范围,那么输入数字 1 将映射到任何其他数字,例如 34。 将 2 输入到任何其他数字,例如 21。 将 3 输入到任何其他数字,例如 10 等。 所有映射的数字应在 50 范围内,并且不允许重复。 (映射时没有联盟)也不允许映射到该数字。请注意,如果最大范围相同(在本例中为 50)并且此函数的输入数字 2 应在整个应用程序的任何时间返回值 21。

函数时间复杂度应该更低。

【问题讨论】:

  • 你不需要所有的数学,只需在开始时随机排序列表,然后播放一首歌曲,这就是所有随机播放功能的基本工作方式
  • Collections.shuffle(yourMusicList);
  • 只需使用现有的Collections.shuffle()stackoverflow.com/questions/969573/java-random-collection
  • 我已经提到Collection.shuffle是不可行的。我可以随时操作我的列表,如删除、插入等。这会影响应用程序用户界面的咨询,如播放第 10 首歌曲但查看第 4 首歌曲信息。
  • 通读您对该哈希函数的要求,您似乎希望它是可重复的(例如,每次 2 个哈希到 21)。为什么?您真的希望您的音乐播放器具有非随机且始终以相同顺序播放歌曲的随机播放功能吗?为什么禁止任何数字对自己进行哈希处理?即使一两个碰巧对自己进行散列,大多数数字散列到其他东西(给您的用户带来随机性的体验)还不够吗?即使有人给了你你要求的哈希函数,我也不确定它是否是你真正想要的。

标签: java android random numbers hash-collision


【解决方案1】:

您最初仍然可以使用Collections.shuffle()。当您继续播放音乐时,请跟踪当前歌曲所在的索引。所以假设你已经播放了 7 首歌曲,目前是第 8 首。然后curr=7要删除歌曲时,在列表中找到该歌曲并删除。如果要插入歌曲,请在curr + 1songList.size() 之间随机生成一个数字。使用songList.add(index, element) 在此处插入您的歌曲。如果你觉得移动太耗时,那么你可以复制这个索引处的 val,将它添加到列表的末尾,然后在那个索引处插入新歌。

【讨论】:

    猜你喜欢
    • 2022-12-05
    • 1970-01-01
    • 2016-05-21
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    相关资源
    最近更新 更多