java.secure.random对于赌博业来说是一个足够的选择吗?
Java在包Java.secure.random中提供了一个加密安全的随机数生成器 如果我考虑RNG的播种和循环再实例化,是否有可能使用这个数发生器?或者我可以使用数字生成器“原样”吗 有人使用过这个发电机吗 编辑:要求如下: a) 在统计上独立 b) 在其范围内公平分布(在统计预期范围内) c) 通过各种公认的统计测试java.secure.random对于赌博业来说是一个足够的选择吗?,java,algorithm,random,prng,Java,Algorithm,Random,Prng,Java在包Java.secure.random中提供了一个加密安全的随机数生成器 如果我考虑RNG的播种和循环再实例化,是否有可能使用这个数发生器?或者我可以使用数字生成器“原样”吗 有人使用过这个发电机吗 编辑:要求如下: a) 在统计上独立 b) 在其范围内公平分布(在统计预期范围内) c) 通过各种公认的统计测试 d) 加密能力强。您可以使用java.security.SecureRandom,就像您可以使用java.util.Random处理此类事情一样 请注意,java.securi
d) 加密能力强。您可以使用
java.security.SecureRandom
,就像您可以使用java.util.Random
处理此类事情一样
请注意,java.security.SecureRandom
可能依赖于运行程序的计算机的一些熵。如果从中获得许多随机值,则它可能会阻塞,直到计算机生成足够的熵为止(例如,在linux上java.security.SecureRandom
使用/dev/uradom
)
因此,如果您想生成许多随机值并可以使用PRNG,请使用
java.util.random
表示它可能会阻止等待系统生成更多熵(例如,在Linux中,它从/dev/random获取随机数),因此如果您要使用它,也许您需要硬件的帮助:安装随机数生成器卡(一种生成真实随机数而不是伪随机数的硬件设备),这样您的系统将以足够的速度生成随机数,这样您的程序就不会被阻塞。正如其他人所说,安全RNG的吞吐量可能有限。为了缓解这种情况
您可以通过植入CPRN来拉伸安全的随机性,也可以
尝试优化您对比特流的使用
例如,要洗牌一副牌,您只需要226位,但需要一个简单的数字
算法(为每张卡调用nextInt(n)
)可能使用1600或3200
比特,浪费了你85%的熵,使你更易受影响七倍
拖延
对于这种情况,我认为这是适当的
接下来,我们将针对更多问题进行一些性能分析
昂贵的熵源(还包含代码):
我倾向于高效使用而不是伸展,因为我认为
证明一个有效率的消费者的公平性要容易得多
值得信赖的熵流,比证明任何绘制方法的公平性都要好
与一个良好的种子PRNG
EDIT2: 我不太懂Java,但我把它放在一起:
public class MySecureRandom extends java.security.SecureRandom {
private long m = 1;
private long r = 0;
@Override
public final int nextInt(int n) {
while (true) {
if (m < 0x80000000L) {
m <<= 32;
r <<= 32;
r += (long)next(32) - Integer.MIN_VALUE;
}
long q = m / n;
if (r < n * q) {
int x = (int)(r % n);
m = q;
r /= n;
return x;
}
m -= n * q;
r -= n * q;
}
}
}
公共类MySecureRandom扩展了java.security.SecureRandom{
私有长m=1;
私有长r=0;
@凌驾
公共最终int nextInt(int n){
while(true){
如果(m<0x8000000L){
m+1您可以选择不同的SecureRandom策略,有些使用种子,有些不使用。谢谢您的回答。我刚刚用需求更新了问题。不幸的是PRNG是不够的。进一步探讨这个问题,我只是注意到最后的SecureRandom生成器是SHA1。他们可能正在做一些事情g除了明显的;否则SHA1的内部状态为160位,这不足以洗牌一副牌。这意味着无论您对RNG或洗牌算法做了什么,它都将仅限于产生可能排列的子集。严格来说,这并不是您的要求之一所以也许没关系。第一个链接已经死了,存档在这里: