【问题标题】:Android SDK Random and SecureRandom returning not so random valuesAndroid SDK Random 和 SecureRandom 返回不那么随机的值
【发布时间】:2023-03-26 17:42:01
【问题描述】:

TLDR:我有一个单身

Random random = new SecureRandom(); // tried with new Random() as well

我使用同一个实例来调用 random.nextInt(3),我得到的结果如下:2、2、2、0、2、2、2、1、2、2。很多'2',但没有那么多的'0'或'1'。会发生什么?

长版:我有一个游戏,其中敌人随机使用 3 种技能中的一种(通过 random.nextInt(3))并且他们最终总是使用相同的技能一遍又一遍。无论是在模拟器上还是在手机上。他们很少使用不同的技能。

当然,在测试中执行 1000 次 random.nextInt(3) 调用会返回看似随机的值,但在我的游戏中不会。而且我只实例化了 Random/SecureRandom 一次并将其用作单例。

在极少数情况下,它会相反:0、1、0、0、1、2、1、1、0、1、0、1、1、0、0。我不明白发生了什么或如何解决它。

【问题讨论】:

  • 根据什么定义2, 2, 2, 0, 2, 2, 2, 1, 2, 2 会是一个不那么随机的序列?检查this
  • 我已经尝试了 100 多次,几乎总是得到 2 次,无论是在模拟器还是手机上。
  • 我要说的是,您不可能通过查看序列来评估随机性,我们只是人类 :) “我已经尝试了 100 多次,几乎总是得到 2 个 i>" - 你得到了多少次2 超过 100 次尝试?
  • 我明白你的意思,你认为我做错了什么或者这是一个观点问题是正确的。但是我在这个项目上工作了一年多,几乎每次我都得到 2。一开始我以为这只是运气不好,但随着时间的推移,我一直看到这种模式。我什至在写这篇评论之前就尝试过,在得到 1 之前得到了 5 次 2。我检查了我所有的代码(而且我是一名专业的 Java 开发人员),研究了网络,但找不到发生这种情况的原因.
  • 我并没有假设您做错了什么,这听起来像是一个非常奇怪的问题,我认为您可以记录一些数据以使问题更加清晰。如果 0、1 和 2 的分布不趋向于各 1/3,那么了解实际分布可能有助于找到问题的原因。

标签: java android random


【解决方案1】:

编辑: 在这种情况下,您可以尝试使用 here 指定的 getInstanceStrong() 方法,看看是否会产生您想要的结果。从 JDK8 开始,getInstanceStrong() 方法将返回平台上可用的最强 SecureRandom 实现。

【讨论】:

  • 我想要区间 [0, 2] 中的值。问题是我大多得到“2”,很少得到“0”或“1”。
  • 我尝试了使用强实例的实现,结果是0,1,0,1,1,0,0,1,0,1,1,2,1,0,0,2,0,1,0,0,1,2 我希望这对你也有用。
  • @AlexParvan,除非您正在处理(引用文档)“像 RSA 公钥/私钥这样的高价值/长期存在的秘密”,否则使用 getInstanceStrong() 是矫枉过正的,并且可能会导致严重的问题,如果没有足够的随机数据可用,必须收集熵,导致对 SecureRandom 的调用被阻塞。
猜你喜欢
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多