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

c+之间的伪随机不一致+;和c#,c#,c++,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

我试图将一个伪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的int类型数据是4字节,像C++长,C长的长度是8字节。

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


有什么想法吗?

您以不同的方式将这两个语句插入括号,从而改变了它们的含义。
C++
代码更新
\u last\u rand
然后右移结果,
C
代码在更新
\u last\u rand
之前执行右移。我把下面的陈述排成一行,使区别更加明显

C++:

C#:


问题是您在differentityl中加了括号,这会导致在
\u last\u rand
中存储不同的值。。。使用您的代码
\u last\u rand
在第一次运行后存储28818。。。用C++代码存储1888663550,这是<>代码> > >代码>之前的值>代码> > />代码>。因此,它从第二轮开始偏离

在C<

中实现与C++中相同的行为
C++代码在某个地方缺少括号。另外,您能否澄清每种语言的
\u last\u rand
类型。(对于C++,在你的PaltFrm上的那个类型的大小)。如果可能的话,你使用的种子和每个平台上的前两个随机数。当然,种子是1274653591,它的正确设置都是两次。在C++代码中,前两个答案是28818和20295。这些都是正确的。在C#中,前两个结果是28818和28610_last_rand是两种语言中的整数(4字节)。我使用的是32位程序,所以C++中的int和long的大小应该都是4字节。(缺少的括号与计算无关)你知道,如果你使用临时变量,它会使你的意图更清晰,并且会减少你在这里发现的错误。此外,一个好的编译器(抖动)应该无论如何优化它。在商店前轮班,我得到了一组答案。在商店后面轮班,我得到了另一个。史蒂夫:我想强调的是,我认为
C++
代码更为正确。如果在更新变量之前右移,则每次迭代都会截断“随机”位。
return (((_last_rand =  _last_rand * 214013L + 2531011L) >> 16) & 0x7fff);
return (((_last_rand = (_last_rand * 214013  + 2531011 ) >> 16) & 0x7fff));
return (((_last_rand =  _last_rand * 214013 + 2531011) >> 16) & 0x7fff);