Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Google.Math.Long将JS转换为C#_Javascript_C# - Fatal编程技术网

Javascript 使用Google.Math.Long将JS转换为C#

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

我正在将一些Javascript代码转换为C#,但在Google math的长度和函数的运行方式方面遇到了一些问题。这实际上是Delphi随机函数的一个版本——据我的同事说

在javascript中,我有这个

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#的输出仅对正值正确,负值不正确

将值强制转换为字节会使值几乎匹配,但并不完全匹配

有人知道为什么会发生这种情况吗?

有几个问题:

  • 您已将
    \u seed
    声明为64位
    。它应该是32位的
    int
  • 在执行64位乘法之前,需要将
    \u seed
    maxValue
    强制转换为
    uint
以下C#代码复制了Delphi PRNG:

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的种子创建不同的实例