【发布时间】: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