c++和c#之间不一致的伪随机
Inconsistent pseudo random between c++ and 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));
}
我删除了l,因为c#的int数据类型是4个字节,像c++的long,而c#的long是8个字节。
第一次从种子运行函数时,答案与c++版本一致,但随后它开始发散。
任何想法?
您以不同的方式将这两个语句括起来,从而改变了它们的含义。C++
代码先更新_last_rand
,然后右移结果,C#
代码先右移结果,然后更新_last_rand
。我把下面的语句排列起来,使区别更明显。
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);
相关文章:
- 大于65535的C++数组[size]引发不一致的溢出
- 在 C++(和 C)中进行类型转换时明显不一致
- 填充上编译器生成的复制构造函数之间的不一致
- 犰狳的 print() 方法和 cout 在从 Rcpp 调用时顺序不一致
- CreateDIBSection为同一图像返回不一致的位图位值
- 在 Qml 中从 QSqlTableModel 中删除单行时视图不一致
- 模板参数推导不一致
- 声明中不一致的no是否违反ODR?
- 如何删除分支因子不一致的树,最大为 30,40
- 从 C++ 函数与 Python 函数返回的不一致值用于偏斜正态分布
- 从 C 字符串构造 std::string 与从另一个 std::string 构造 std::string 不一致
- 这种比较是否不一致(或者存在其他问题)?
- 以下可变参数模板行为是否不一致?
- 如何修复我的链表读数不一致的问题?
- 在C++17中,为什么类模板和函数模板的指针类型推导明显不一致
- void 函数中的指针参数返回不一致的值
- 如何查找导致结果不一致的代码
- 跨平台 mySQL 与字符集不一致
- C++:不一致的 std::p ow( 类型 ) 定义
- c++和c#之间不一致的伪随机