疑似ランダム関数をC++からC#に変換しようとしていますが、正しい値が返されないようです。その重要なのは、暗号化に一貫したセットを使用するので、乱数だけを使用することはできません。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));
}
#S long型が8バイトであるCに対し、C#のS intデータ型は、C++ long型のような4バイトであるので、私はLSは削除されます。
シードから関数が初めて実行されるとき、答えはC++バージョンと一貫していますが、それは発散し始めます。
アイデア?
では使用++ C++コードはどこかかっこが欠落しています。また、 '_last_rand'が各言語でどのような型かを明確にすることができます。可能であれば、使用しているシードと各プラットフォームの最初の2つの乱数を使用します(C++では、その型のサイズをpaltformに入れます)。 –
確かに、シードは1274653591で、正しく設定されています。 C++コードでは、最初の2つの答えは28818と20295です。これは正しいです。 C#では、最初の2つの結果は28818と28610です。_last_randは両方の言語でint(4バイト)です。私は32ビットのプログラムを使用しているので、intの長さとC++の長さは両方とも4バイトでなければなりません。 (括弧が欠落していると計算には意味がありません) – Steve
一時変数を使用すると、意図が明確になり、ここで見つけたようにエラーが発生しにくくなります。また、良いコンパイラ(ジッタ)*はそれを最適化する必要があります。 –