我正在尝试将伪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 ++版本一致,但随后开始出现分歧。
有什么想法吗?
答案 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);