【问题标题】:What is a cross platform way to select a random seed in Java?在 Java 中选择随机种子的跨平台方法是什么?
【发布时间】:2010-09-13 07:17:26
【问题描述】:

阅读此答案后: best way to pick a random subset from a collection?

这让我想知道,如何在 Java 中选择随机种子?

不要说使用 System.currentTimeMillis() 或 System.nanoTime()。阅读这篇文章,看看为什么不这样做。

这是一个很难的问题,但让我把它变得更难。假设您需要在不连接互联网、不使用用户输入(IE,没有 gui)的情况下生成随机种子,并且它必须是跨平台的(因此没有 JNI 来访问硬件)。

是否有一些 JVM 变量可以作为我们随机性的来源进行监控?

这可以吗?还是不可能?

【问题讨论】:

    标签: java random cross-platform random-seed


    【解决方案1】:

    看看Uncommons Maths(完全披露:我写的)。它应该可以解决您在 Java 中遇到的大多数随机数问题。

    即使你不使用它,你也应该能够从它提供的各种SeedGenerator 实现中获得一些想法。基本上,它默认使用/dev/random。如果不存在(例如 Windows),它要么尝试从 random.org 下载数据,要么使用 SecureRandom.generateSeed

    我认为 SecureRandom.generateSeed 是您在不依赖任何特定平台或 Internet 的情况下可以做到的最好的方法。

    【讨论】:

    • 哇哦,你也有一个 CombinationGenerator !前几天就写了这么一篇……
    • 我在另一个问题中添加了 Uncommons Maths:stackoverflow.com/questions/130095/…
    • 希望大家使用https连接random.org。
    【解决方案2】:

    System.currentTimeMillis() 与每次生成种子时递增的全局计数器结合使用。使用AtomicLong 作为计数器,这样您就可以提高效率和线程安全。

    “Combine”并不意味着“add”或“xor”,因为它太容易重复了。相反,哈希。您可能会变得复杂,并将 long 和 counter 塞入例如16 字节和 MD5,但我可能会使用 64 位版本的 Adler CRC 或其他一些 64-bit CRC

    【讨论】:

      【解决方案3】:

      嗯,那篇文章说 32 位种子不好,但 64 位种子很好。 System.currentTimeMillis() 是 64 位种子。

      【讨论】:

      • 当前十六进制的 currentTimeMillis() 是: 0x00 00 01 1C 9F B4 CF 78 这看起来像一个非常好的 64 位数字吗?当然,您可以将其散列为更好的 64 位数字,但您的源仍然小于 64 位。在我的应用程序中,我实际上需要超过 700 位的种子。
      猜你喜欢
      • 1970-01-01
      • 2014-06-01
      • 1970-01-01
      • 2013-03-27
      • 2013-01-26
      • 1970-01-01
      • 2012-09-04
      • 2019-01-26
      • 2019-11-12
      相关资源
      最近更新 更多