Javascript 使用Google.Math.Long将JS转换为C#
我正在将一些Javascript代码转换为C#,但在Google math的长度和函数的运行方式方面遇到了一些问题。这实际上是Delphi随机函数的一个版本——据我的同事说 在javascript中,我有这个Javascript 使用Google.Math.Long将JS转换为C#,javascript,c#,Javascript,C#,我正在将一些Javascript代码转换为C#,但在Google math的长度和函数的运行方式方面遇到了一些问题。这实际上是Delphi随机函数的一个版本——据我的同事说 在javascript中,我有这个 function _nextRandom(maxValue, seedValue) { if (seedValue !== null) _seed = new goog.math.Long(seedValue); _seed = _seed.multip
function _nextRandom(maxValue, seedValue) {
if (seedValue !== null)
_seed = new goog.math.Long(seedValue);
_seed = _seed.multiply(134775813).add(_one);
_seed = new goog.math.Long(_seed.getLowBitsUnsigned());
return _seed.multiply(new goog.math.Long(maxValue)).getHighBits() >>> 0;
}
在C#我有这个-到目前为止
private int _nextRandom(int maxValue, int seedValue)
{
if (seedValue != 0)
_seed = seedValue;
_seed = _seed * 134775813 + 1;
_seed = (long)((int)_seed); // get lower 32 bits
return (int)(((ulong)_seed * (ulong)maxValue) >> 32); // get upper 32 bits
}
最大值始终为254,并且第一次运行_nextRandom时,seedValue为1024,之后每隔一次为0(在C中)或null(在JS中)
这里C#的输出仅对正值正确,负值不正确
将值强制转换为字节会使值几乎匹配,但并不完全匹配
有人知道为什么会发生这种情况吗?有几个问题:
- 您已将
声明为64位\u seed
。它应该是32位的长
int
- 在执行64位乘法之前,需要将
和\u seed
强制转换为maxValue
李>uint
private static int _seed = 0;
private static int _nextRandom(int maxValue, int seedValue)
{
if (seedValue != 0)
_seed = seedValue;
_seed = _seed * 0x08088405 + 1;
return (int)(((ulong)(uint)_seed * (uint)maxValue) >> 32);
}
显然,这段代码不是线程安全的,但我相信您已经知道了。一个更干净的实现是将其封装在一个类中,这样您就可以使用PRNG的种子创建不同的实例