2015-03-02 84 views
-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("-----------------"); 
     } 
    } 
} 
+5

右移一个负数不移位的符号位('-2 >> 1 == -1')。 – Phylogenesis 2015-03-02 16:56:33

+0

“XorShift128”中的作业有什么意义?分配后不使用'x','y'和'z'。 – xxbbcc 2015-03-02 17:01:40

+0

@Phylogenesis,谢谢!你已经回答了为什么我的课程工作不能正常工作,它发生在10年前左右))))现在我知道肯定))) – Lu4 2015-03-02 17:22:20

回答

0

答案是在得益于评论提供给系统发育:

-2 >> 1 == -1 
相关问题