我有 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(使用前将#替换为@)