2015-03-02 3 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

+0

В чем смысл заданий в 'XorShift128'? 'x',' y' и 'z' не используются после назначений. – xxbbcc

+0

@ Филогенез, спасибо! Вы ответили, почему моя курсовая работа не функционировала правильно, это случилось где-то около 10 лет назад))) Теперь я это точно знаю))) – Lu4

ответ

0

Ответ был предоставлен в комментарии благодаря филогенезе:

-2 >> 1 == -1 
Смежные вопросы