c++和c#之间不一致的伪随机

Inconsistent pseudo random between c++ and c#

本文关键字:随机 不一致 之间 c++      更新时间:2023-10-16

我正在尝试将伪rand函数从c++转换为c#,但它似乎没有返回正确的值。重要的是,我使用一个一致的加密集,所以我不能只是使用一个随机数。

这是c++中的函数。

int get_pseudo_rand()
{
  return( ((_last_rand = _last_rand * 214013L
     + 2531011L) >> 16) & 0x7fff );
}

这是我的c#替代

int get_pseudo_rand()
{
  return (((_last_rand = (_last_rand * 214013 + 2531011) >> 16) & 0x7fff));
}

我删除了l,因为c#的int数据类型是4个字节,像c++的long,而c#的long是8个字节。

第一次从种子运行函数时,答案与c++版本一致,但随后它开始发散。

任何想法?

您以不同的方式将这两个语句括起来,从而改变了它们的含义。C++代码先更新_last_rand,然后右移结果,C#代码先右移结果,然后更新_last_rand。我把下面的语句排列起来,使区别更明显。

c++:

return (((_last_rand =  _last_rand * 214013L + 2531011L) >> 16) & 0x7fff);
c#:

return (((_last_rand = (_last_rand * 214013  + 2531011 ) >> 16) & 0x7fff));

问题是你有不同的括号,导致在_last_rand中存储不同的值…使用您的代码_last_rand在第一次运行后存储28818…在c++代码中,它存储1888663550,这是>>之前和&之前的值。因此,它开始偏离第二次运行…

在c#中使用

实现与c++相同的行为
return (((_last_rand =  _last_rand * 214013 + 2531011) >> 16) & 0x7fff);