【问题标题】:Random in Java often generating same valueJava中的随机经常产生相同的值
【发布时间】:2018-09-04 13:14:41
【问题描述】:

我正在使用它来生成 513 之间的值

 int randomGeneratedLevelValue = ThreadLocalRandom.current().nextInt(5, 13);

如何减少相同的匹配?

【问题讨论】:

标签: java android random


【解决方案1】:

没有任何方法可以减少真正随机数序列中的重复次数,而不会使随机数序列产生偏差。

因此,例如,在您的序列10, 5, 12, 12, 13, 13 中,12 后面跟着另一个 12 的机会是 9 分之一;即与范围内任何其他数字的概率相同。

现在,由于您使用的是 Random / ThreadLocalRandom,您可能会看到线性同余生成器中固有的自相关效应。如果是这样,这些影响可以通过使用SecureRandom 来消除。但是SecureRandom 的调用成本要高得多。


另一种方法是故意偏向反对重复;例如(伪代码)

int random = rand.nextInt(...)
if (random == lastRandom) {
     random = rand.nextInt(...);
}
return random;

但要小心。引入偏见可能会产生意想不到的后果。

【讨论】:

  • 最后一个数字是多少??
  • 您从生成器获得的最后一个随机数。这是伪代码
  • 最后一个数字是多少?? ThreadLocalRandom.current().nextInt(5, 13) ? 12 (nextInt(int least, int bound) 在给定的最小值(包括)和bound(不包括)之间返回一个伪随机、均匀分布的值。)...但是你问如何减少相同的匹配? 这个答案回答了这个问题
  • @Selvin - 我认为 OP 在问我的伪代码中的 lastRandom 是什么意思。但这真的很难说。他的问题和cmets非常不清楚。
  • 呵呵他用ThreadLocalRandom.current().nextInt(min, max+1)回答自己为什么我认为最后一个数字是什么?是关于ThreadLocalRandom.current().nextInt(5, 13)返回的最后一个数字而不是lastRandom在你的代码 .... 我们在这里遇到的是无法沟通
【解决方案2】:

Birthday Paradox 预测随机数重复的概率比您想象的要高得多。例如,它预测只有 23 个随机人,其中两个人生日相同的可能性超过 50%。以Pigeonhole Principle来说,需要367人才能有100%的重复概率,但在此之前,重复的概率非常高。

这是概率分布(来自维基百科):

rule of thumb 用于估算在重复概率达到 sqrt(2m * p(n)) 之前必须生成的数字数量,其中 m 是可能的随机数数量,p(n) 是您正在寻找的概率为了。因此,例如,如果您要生成 50 个数字范围内的随机数(例如,如果您从 100 到 150 中选择一个随机数),您只需要生成大约 sqrt((2 * 50) * 0.5) = 7.07 随机数,然后几率就可以了最好不要重复。如果您在 50 个数字范围内生成 8 个随机数字,那么有重复的几率总比没有好。 (请注意,这只适用于高达 1/2 的 p(n) 值)。

在您的情况下,任何特定随机值(5、6、7、8、9、10、11、12)都有 8 个可能的值,因此您只需要生成 sqrt(8) = 2.83 数字,就有可能发生50% 你会有一个副本。换句话说,生日悖论预测您只需要生成大约 3 个数字,就有可能比没有重复的机会更好。

另见this Q&A

还有一点:注意Gambler's Fallacy,其中人们假设如果您随机生成例如 10,则下一个概率不会是 10。实际上,假设您正在生成随机数字,任何特定数字的几率都是 1/8,无论之前是什么数字。换句话说,如果你生成一个 12,那么下一个数字是 10 的概率是 1/8。如果生成 7,则下一个数字为 10 的几率为 1/8。如果你生成一个 10,那么下一个数字是 10 的概率仍然是 1/8。每个数字都是一个独立的事件(即到目前为止您生成的数字至少不会影响未来数字的概率分布)。

TL;DR 您需要生成的数字比您想象的要少得多,否则您可能会开始重复 - 特别是如果您要生成的随机数字范围很小(和你一样)这个数字特别低。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    相关资源
    最近更新 更多