いくつかのコードを変換しようとしていますが、グーグルで検索しても、このビットを変換する方法がわかりません。
float fR = fHatRandom(fRadius);
float fQ = fLineRandom(fAngularSpread ) * (rand()&1 ? 1.0 : -1.0);
float fK = 1;
このビット
(rand()&1 ? 1.0 : -1.0);
わかりません。
50/50 の確率で 1 または -1 です。
同等の C# コードは次のようになります。
((new Random().Next(0, 2)) == 0) ? 1.0 : -1.0;
Next(0,2)
0 または 1 を返します。
コードが頻繁に呼び出される場合は、インスタンスを保存してRandom
再利用する必要があります。新しいインスタンスを作成するRandom
と、疑似乱数のシーケンスを決定するシードで初期化されます。「ランダム性」を向上させるために、ランダムシーケンスを頻繁に再初期化しないでください。
あなたは使用することができます
Random rnd = new Random();
(rnd.NextInt(2) * 2 -1); // 1 or -1
C++ サンプルは乱数を生成し、その最下位ビットを使用して残りを破棄します。次に、最下位ビットを使用して -1 または 1 を選択します。
C# では、次のようになります。
new Random().Next(0, 2) * 2 - 1
重要: ループでこれを行う場合は、Random
どこかのインスタンスを保存しNext
、コンストラクターではなく、ループ内でのみ呼び出します。これはパフォーマンスの最適化だけではありません。それ以外の場合は、約 100 ミリ秒の継続時間の同一ビットのシーケンスが表示されるため、Random のパラメーターなしのコンストラクターへの呼び出しはほとんどなく、アプリの起動ごとに 1 回行うのが理想的です。
1.0 または -1.0 のいずれかで、いずれかの可能性が等しい
rand() は、0x01、つまり最初のビットで論理積された数値を生成し、ビットを取得するかどうかに応じて、1.0 または -1.0 を取得します。
他の人が言ったように、50% の確率でランダム化できます。
正確な翻訳が必要な場合は、次のようになります。
((new Random().Next() & 1 > 0) ? 1.0 : -1.0)
条件式の最初の部分からブール値を作成する必要があります。