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

时间:2011-11-11 06:43:44

标签: c# c++

我正在尝试将伪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));
}

我删除了Ls,因为c#s int数据类型是4个字节,比如c ++ long,而c#s long是8个字节。

第一次从种子运行函数时,答案与c ++版本一致,但随后开始出现分歧。

有什么想法吗?

2 个答案:

答案 0 :(得分:9)

您以不同的方式将两个语句括起来,改变了它们的含义。 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));

答案 1 :(得分:0)

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

实现与在C#中使用的C ++相同的行为

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