-1
这些是128位XorShift
PRNG的函数,通过查看代码,我永远不会认为类型(Int32/UInt32)的差异可能会导致不同的结果。在这两种情况下,我们都使用相同位数的字节向左或向右移动相同数量的字节,为什么我们得到不同的结果呢?为什么下面这段代码会提供不同的结果?
Int32 XorShift128(Int32 x, Int32 y, Int32 z, Int32 w)
{
var t = x^(x << 11);
x = y;
y = z;
z = w;
return w = w^(w >> 19)^t^(t >> 8);
}
UInt32 XorShift128(UInt32 x, UInt32 y, UInt32 z, UInt32 w)
{
var t = x^(x << 11);
x = y;
y = z;
z = w;
return w = w^(w >> 19)^t^(t >> 8);
}
void Main()
{
Random rand = new Random();
for (var i = 0; i < 10000000; i++) {
var x = rand.Next();
var y = rand.Next();
var z = rand.Next();
var w = rand.Next();
var u = XorShift128(x,y,z,w);
var v = XorShift128((UInt32)x,(UInt32)y,(UInt32)z,(UInt32)w);
if ((Int32)v != u) {
Console.WriteLine(x);
Console.WriteLine(y);
Console.WriteLine(z);
Console.WriteLine(w);
Console.WriteLine(u);
Console.WriteLine((Int32)v);
Console.WriteLine("-----------------");
}
}
}
右移一个负数不移位的符号位('-2 >> 1 == -1')。 – Phylogenesis 2015-03-02 16:56:33
“XorShift128”中的作业有什么意义?分配后不使用'x','y'和'z'。 – xxbbcc 2015-03-02 17:01:40
@Phylogenesis,谢谢!你已经回答了为什么我的课程工作不能正常工作,它发生在10年前左右))))现在我知道肯定))) – Lu4 2015-03-02 17:22:20