当前位置:  开发笔记 > 编程语言 > 正文

Java中的真正随机生成

如何解决《Java中的真正随机生成》经验,为你挑选了5个好方法。

我正在阅读Math.random()javadoc并看到随机只是伪随机.

是否有一个库(特别是java)根据随机变量生成随机数,如环境温度,CPU温度/电压或类似的东西?



1> Greg Dean..:

查看http://random.org/

RANDOM.ORG是一种真正的随机数服务,可通过大气噪​​声产生随机性.

可以在此处找到与其连接的Java库:http: //sourceforge.net/projects/trng-random-org/


也许我是偏执狂,但如果我将它用于安全相关的任何事情,我不会相信第三方提供的随机数.最好使用平台解决方案 - 特别是因为有一个可用.
没有平台解决方案会生成* True *随机数。但是您是对的,如果您需要安全性方面的随机性,请使用Crypto API。
大气噪声是真正随机的还是有可检测的模式?
JCA提供商可以使用硬件RNG实施SecureRandom,这些RNG作为TPM和一些英特尔芯片组的一部分越来越常见.这些使用不可预测的量子力学现象来(缓慢地)产生真正的随机比特.由于速率很低,因此最好将其作为良好PRNG的种子.

2> ykaganovich..:

你的问题含糊不清,导致答案到处都是.

如果您正在寻找依赖于系统随机性源的随机实现(正如我猜测的那样),那么javax.crypto.SecureRandom会这样做.java.security文件中Sun安全提供程序的默认配置具有以下内容:

#
# Select the source of seed data for SecureRandom. By default an
# attempt is made to use the entropy gathering device specified by
# the securerandom.source property. If an exception occurs when
# accessing the URL then the traditional system/thread activity
# algorithm is used.
#
# On Solaris and Linux systems, if file:/dev/urandom is specified and it
# exists, a special SecureRandom implementation is activated by default.
# This "NativePRNG" reads random bytes directly from /dev/urandom.
#
# On Windows systems, the URLs file:/dev/random and file:/dev/urandom
# enables use of the Microsoft CryptoAPI seed functionality.
#
securerandom.source=file:/dev/urandom

如果你真的要求用更真实随机的东西覆盖它,可以通过更改此属性或使用其他SecureRandom来完成.例如,您可以使用由HSM模块支持的JCE提供程序,例如nCipher nShield,它具有自己的PRNG或线程中提到的其他解决方案.



3> Joachim Saue..:

由于利用这些随机数据源需要某种类型的硬件访问,因此使用纯Java无法编写这样的库.

但是,您可以尝试编写与平台相关的代码来读取随机数据的平台源.对于Linux(也可能是其他类似Unix的系统),/dev/random例如.

另外,看看SecureRandom类,它可能已经拥有了你想要的东西.



4> Adam Jaskiew..:

又快又脏:

public static int generateRandom() throws IOException
{
    int num = 0;
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    for (int i = 0 ; i < Integer.SIZE ; i++)
    {
        System.out
          .println("Flip a fair coin. Enter h for heads, anything else for tails.");

        if (br.readLine().charAt(0) == 'h')
        {
            num += Math.pow(2, i);
        }
    }

    return num;
}



5> John D. Cook..:

确保你真的想要"真正的"随机数.必须测量物理来源的随机性,并且测量过程会引入一些偏差.对于某些应用,"伪"随机数实际上优于"真实"随机数.它们可以具有更好的统计属性,您可以更快地生成它们.另一方面,如果你不小心的话,你可以用伪随机数发生器射击自己的脚.

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有