1

いくつかのコードを変換しようとしていますが、グーグルで検索しても、このビットを変換する方法がわかりません。

    float fR = fHatRandom(fRadius);
    float fQ = fLineRandom(fAngularSpread ) * (rand()&1 ? 1.0 : -1.0);
    float fK = 1;

このビット

(rand()&1 ? 1.0 : -1.0); 

わかりません。

4

5 に答える 5

7

50/50 の確率で 1 または -1 です。

同等の C# コードは次のようになります。

((new Random().Next(0, 2)) == 0) ? 1.0 : -1.0; 

Next(0,2)0 または 1 を返します。

コードが頻繁に呼び出される場合は、インスタンスを保存してRandom再利用する必要があります。新しいインスタンスを作成するRandomと、疑似乱数のシーケンスを決定するシードで初期化されます。「ランダム性」を向上させるために、ランダムシーケンスを頻繁に再初期化しないでください。

于 2012-10-21T19:06:13.287 に答える
3

あなたは使用することができます

Random rnd = new Random();
(rnd.NextInt(2) * 2 -1); // 1 or -1
于 2012-10-21T19:11:12.137 に答える
2

C++ サンプルは乱数を生成し、その最下位ビットを使用して残りを破棄します。次に、最下位ビットを使用して -1 または 1 を選択します。

C# では、次のようになります。

new Random().Next(0, 2) * 2 - 1

重要: ループでこれを行う場合は、Randomどこかのインスタンスを保存しNext、コンストラクターではなく、ループ内でのみ呼び出します。これはパフォーマンスの最適化だけではありません。それ以外の場合は、約 100 ミリ秒の継続時間の同一ビットのシーケンスが表示されるため、Random のパラメーターなしのコンストラクターへの呼び出しはほとんどなく、アプリの起動ごとに 1 回行うのが理想的です。

于 2012-10-21T19:18:15.627 に答える
1

1.0 または -1.0 のいずれかで、いずれかの可能性が等しい

rand() は、0x01、つまり最初のビットで論理積された数値を生成し、ビットを取得するかどうかに応じて、1.0 または -1.0 を取得します。

于 2012-10-21T19:09:01.227 に答える
0

他の人が言ったように、50% の確率でランダム化できます。

正確な翻訳が必要な場合は、次のようになります。

((new Random().Next() & 1 > 0) ? 1.0 : -1.0)

条件式の最初の部分からブール値を作成する必要があります。

于 2012-10-21T19:11:08.980 に答える