【问题标题】:True Random number of an integer through a byte generator (BlueRand)True 通过字节生成器生成整数的随机数 (BlueRand)
【发布时间】:2018-07-28 02:22:22
【问题描述】:

我正在尝试创建一个 Java 应用程序,它接收一个字符串并使用该字符串来确定应该从 1 - x 的范围内随机选择多少个整数,其中 x 是一个整数值。我知道使用现代计算技术很难/不可能生成“真正的”随机生成,但是 github 存储库引起了我的兴趣,它使用 jpeg 图像作为随机数生成的来源 (https://github.com/prgpascal/bluerand)。

然而,生成器似乎创建了随机数量的字节,所以我想知道你们中是否有人知道如何使用它来以某种方式生成某个范围内的整数。

当然,如果你们中的任何人知道任何其他没有配额限制的生成器,无论是来自具有 api 的网站还是在可以执行此任务的本地计算机上运行的库,我都错过了,我会很高兴了解它并将我的注意力转移到它上!

感谢您的宝贵时间。

【问题讨论】:

  • 使用相同的 JPEG 会生成相同的种子,在我们的处理器中有一个骰子之前,真正的随机现在真的是不可能的。
  • 您正在询问场外资源。 stackoverflow.com/help/on-topic
  • 为什么你认为你需要一个“真正的”随机数生成器? java.util.Randomjava.security.SecureRandom 类如何无法满足您的需求?
  • SecureRandom 可以使用您计算机中的熵源来更加随机。
  • SecureRandom 使用熵源,因此与您将获得的stackoverflow.com/questions/137212/… 一样接近随机

标签: java random trng


【解决方案1】:

这是将“随机”字节数组转换为 0 ... N - 1 范围内的随机数的一种方法:

  1. 取前 8 个字节,并将它们转换为 long;例如

      l = (b[0] & 0xffL) | (b[1] & 0xffL << 8 ) | 
          (b[2] & 0xffL << 16 ) | ... (b[7] & 0xffL << 56 );
    
  2. 计算数字为

      n = Math.floorMod(l, N);
    

如果你们中的任何人知道任何其他没有配额限制的生成器,无论是来自网站...

  1. 询问外部资源是题外话。

  2. 让应用程序依赖于可能会出现故障、可能会消失、可能会导致网络更改成本等问题的网站是个坏主意。

  3. 从不受信任的来源获取随机数是个坏主意:

    • 他们可能正在录音
    • 这些数字实际上可能并不是真正随机的(尽管他们这么说)
    • 这些数字可能有偏差(意外地、故意地)。

另外,请注意,您通过 BlueRand 库从图像中获得的“真正”随机数根本不是随机的……除非您有一个好的随机图像来源;例如如果有运动的图片,则为实时提要。

【讨论】:

    猜你喜欢
    • 2014-05-21
    • 2018-10-09
    • 2014-08-22
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2023-01-03
    • 2017-03-22
    • 2015-08-05
    相关资源
    最近更新 更多