JAVA—硬件体系结构会影响随机数序列的生成吗?
我开发了一个模拟平台(JAVA),用于在有限的三维空间中数千个粒子的运动。 最简单的运动规则由布朗运动给出,布朗运动由零均值和标准差的随机高斯分布确定,该分布取决于所考虑场景中的一些常数因子 粒子点状发射的预期结果是一种沿所有方向均匀扩散的粒子云,云的重心位于初始发射点 我在几台机器上进行了几次模拟,在两台特定机器上得到了奇怪的结果,而其他机器给出的模拟结果符合预期值 更详细地说,粒子云似乎沿着优先方向传播。JAVA—硬件体系结构会影响随机数序列的生成吗?,java,Java,我开发了一个模拟平台(JAVA),用于在有限的三维空间中数千个粒子的运动。 最简单的运动规则由布朗运动给出,布朗运动由零均值和标准差的随机高斯分布确定,该分布取决于所考虑场景中的一些常数因子 粒子点状发射的预期结果是一种沿所有方向均匀扩散的粒子云,云的重心位于初始发射点 我在几台机器上进行了几次模拟,在两台特定机器上得到了奇怪的结果,而其他机器给出的模拟结果符合预期值 更详细地说,粒子云似乎沿着优先方向传播。 也许随机坐标的生成在某种程度上是极化的?它可能取决于CPU的硬件架构? 计算机的体
也许随机坐标的生成在某种程度上是极化的?它可能取决于CPU的硬件架构?
计算机的体系结构是: 类型1:
- 英特尔(R)Core(TM)i7-3770处理器@3.40GHz
- 内存:32GB
- 英特尔(R)核心(TM)i5-2300CPU@2.80GHz
- 内存:从8GB到24GB
- 英特尔(R)至强(R)CPU E5410@2.33GHz
- 内存:24GB
JVM版本是:OpenJDK1.7(64位)嗯,是的。体系结构将对随机数的生成方式产生影响 假设你得到随机数的方法是这样的
new Random().nextInt()
然后在随机
对象的初始值设定项中。它将尝试生成用于创建下一个“随机”数的种子。API生成种子的方式是使用当前的“静态”种子进行计算,并通过当前的纳米时间进行增量
并获得当前的纳米时间。JVM将使用QueryPerformanceCounter(QPC),根据其运行的硬件的不同,QPC以不同的方式实现
如需进一步参考,您可以阅读大卫·霍姆斯的这篇精彩文章谢谢大家的回答 我已经对每个架构执行了几个测试,似乎问题不在于随机数的生成 我已经收集了一个非常长的随机生成的数字序列好几天了,我用Matlab脚本比较了它们 收集的结果显示坐标沿x轴的极化 我决定将这些坐标的生成顺序从x,y,z更改为y,z,x,结果显示沿y轴的极化相同 这意味着第一个生成的值会受到极化的影响,但我不知道为什么 在这种情况下,极化效应随着创建对象的总量而增加(对象越多意味着坐标越多,因此对自定义随机方法的调用也越多) 这是相关代码。通过多线程方法(此处未显示)为每个对象的每个时间步调用move()方法: 其中“random”是一个XORShiftRandom对象:
// XORShiftRandom
int val=31;
double div=Math.pow(2, val);
XORShiftRandom random=new XORShiftRandom();
// End XORShiftRandom
public class XORShiftRandom {
private long seed = System.nanoTime();
public XORShiftRandom() {
}
protected int next(int nbits) {
long x = this.seed;
x ^= (x << 21);
x ^= (x >>> 35);
x ^= (x << 4);
this.seed = x;
x &= ((1L << nbits) -1);
return (int)(x);
}
}
//XORShiftRandom
int-val=31;
双div=数学功率(2,val);
XORShiftRandom=新的XORShiftRandom();
//结束异或移位随机
公共类XORShiftRandom{
private long seed=System.nanoTime();
公共XORShiftRandom(){
}
受保护的int-next(int-nbits){
长x=这个种子;
x^=(x>>35);
x^=(x您如何生成随机数?您应该能够在每台计算机上使用相同的种子为随机数生成器复制完全相同的结果。如果您使用线程,您可能希望使用单个线程进行测试,以便删除任何争用条件。为了确保再现性,您需要使用random指定种子(long)
。此外,如果您希望浮点计算具有精确的可移植性,则应使用strictfp
,尽管它可能会影响某些体系结构(包括英特尔)的性能和/或精度.据我所知,一个具有相同种子的随机对象会生成相同的序列,而不管它在哪个平台上运行。你的示例演示了对随机对象的不当使用。@matt Hmmm。你能更透彻地解释一下为什么你认为我的示例不恰当吗?@kucing_terbang我不认为你的示例不恰当,这是一个很好的示例。我认为它显示了对Random类的不正确使用,这正是您声明的原因。生成的数字依赖于种子的随机性,因为每次都会创建一个新实例。PRG应该被种子化并用于获取一个数字序列。然后Java的PRG将跨平台组成,如文档所述。@matt aaa我明白了,对不起,我的错误是:D
// XORShiftRandom
int val=31;
double div=Math.pow(2, val);
XORShiftRandom random=new XORShiftRandom();
// End XORShiftRandom
public class XORShiftRandom {
private long seed = System.nanoTime();
public XORShiftRandom() {
}
protected int next(int nbits) {
long x = this.seed;
x ^= (x << 21);
x ^= (x >>> 35);
x ^= (x << 4);
this.seed = x;
x &= ((1L << nbits) -1);
return (int)(x);
}
}