Java中的真正随机生成

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

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

查看http://random.org/

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

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

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

如果您正在寻找依赖于系统随机性源的随机实现(正如我猜测的那样),那么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或线程中提到的其他解决方案。

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

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

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

快而脏:

 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; } 

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

J ava Cryptographic Architecture需要加密强大的随机数。 它包含@saua提到的SecureRandom类。

没有真正的随机数生成器,因为它们都依赖于确定性过程来计算随机数,因此,无论生成的数字如何看似遵循真正的随机分布,它们可能是隐藏的一部分 – 而且非常复杂模式,因此它们是伪随机的 。 但是,您可以实现自己的随机数生成器,您可以在C,第二版 – 第7节中的数字食谱中阅读一些很好的,计算成本低廉的方法。 HTH

只是为了澄清:宇宙中唯一存在的TRUE随机生成器是量子随机比特生成器 。 没有其他机制可以向您保证,生成的位是完全随机的,因为即使现在您无法预测结果,也无法保证您将来无法做到这一点。

量子随机比特发生器(QRBG121),是一种快速非确定性随机比特(数字)发生器,其随机性依赖于半导体中光子发射的量子物理过程的固有随机性以及随后的光电效应检测。 在这个过程中,光子随机地逐个检测,彼此独立。 检测到的光子的定时信息用于生成随机二进制数字 – 比特。 这种方法的独特之处在于它仅使用一个光子探测器来产生零和一个光子探测器,这导致非常小的偏置和对元件变化和老化的高免疫力。 此外,通过光电倍增管(PMT)进行单个光子的检测。 与固态光子探测器相比,PMT具有极高的信噪比性能和出现后脉冲的可能性低得多,这可能是不需要的相关性的来源。

更多信息,例如: http : //random.irb.hr/

维基百科引用:约翰·冯·诺伊曼(John von Neumann)有一句名言:“任何使用算术方法产生随机数的人都处于犯罪状态。”

在大多数情况下,伪随机数绰绰有余。 如果你只需要一个简单的随机数,即。 在30%的时间内这样做,然后作为种子的时间戳就是你想要的。 如果这必须是安全的随机数,例如洗牌,你想要更仔细地选择你的种子,有很好的资源来创建安全的种子。

使用种子的原因是能够“调用”由算法生成的相同的随机数序列。 一个非常好的方案就是当你在某种类型上进行随机模拟并且你想重复一个特定的实验时,你只需使用相同的种子。

要获得比Java捆绑的更好的PRNG,请查看Mersenne Twister 。

在大学里我有任务实现随机生成器。 我创建了这样的随机数生成器:创建桌面窗口并要求用户点击窗口上的随机位置,每次点击后我都会点击点击点的坐标。 我认为那是相当随意的。

另见这个问题: 替代熵源

几年前我找到了HotBits – 这些数字来自放射性衰变,真正的随机数。

randomx有一个java库可供访问

每天可以下载多少个数字是有限制的,但是我总是很乐意将它们用作RNG真正随机的种子。

据我所知,他们与机器的时间一起工作……!

使用什么随机数

随机数已经使用了数千年。 无论是掷硬币还是掷骰子,目标都是将最终结果留给随机机会。 计算机中的随机数生成器是相似的 – 它们试图获得不可预测的随机结果。

这有可能成为真正的随机数吗?

是的 !

为了生成“真实”的随机数,计算机测量在计算机外发生的某种类型的物理现象。

对于更多的日常示例,计算机可能依赖于大气噪声,或者只是使用键盘上按键的确切时间作为不可预测数据或熵的来源。 例如,您的计算机可能会注意到您在下午2点后的0.23423523秒处按下了一个键。 抓住与这些按键相关的特定时间,您将拥有可用于生成“真实”随机数的熵源。

NSA和英特尔的硬件随机数发生器

为了使开发人员更容易并帮助生成安全的随机数,英特尔芯片包括一个基于硬件的随机数生成器,称为RdRand。 该芯片在处理器上使用熵源,并在软件请求时向软件提供随机数。

来源: HowToGeek?

以防你可能需要在Android中生成随机数…我使用加速度计数据来获得真实的基于物理的随机数:)