1

さて、数学の問題のために疑似ランダムビットを生成したいと思います。ビットサイズはユーザーが入力します。しかし、通常の問題とは異なり、ここには小さなねじれがあります。ビットが0で始まり、ユーザーが入力したサイズと文字通り一致する場合も、数学の問題は有効な結果をもたらします。例:ユーザー入力4の場合、次のすべてが有効な出力です。

-> 0000
-> 0001
-> 1000
-> 0100

など。私は今、この関数を使用して数値を生成しています。

int randomChoice = choice.Next(1 << (input - 1), (1 << input) - 1);
bitSize = randomChoice;

複雑な配列操作を行わずにC#のリテラルビット長に従う限り、0で始まるランダムビット生成の他の方法はありますか?

4

2 に答える 2

2

次の行:

int randomChoice = choice.Next(1 << (input - 1), (1 << input) - 1)

forinput = 4は次と同等です。

int randomChoice = choice.Next(8, 15);

これは、MSDNドキュメントごとに、次の値のいずれかを選択します:8、9、10、11、12、13、14-ランダムに。下限(8)は)包括的_であり、上限(15)は排他的であるとドキュメントに明確に記載されているため、値15は選択されないことに注意してください。

バイナリの値は次のとおりです。

8 : 1000
9 : 1001
10: 1010
11: 1011
12: 1100
13: 1101
14: 1110

@Jon Skeetが言っていたのは、常にMSB(左端のビット)が設定された乱数を生成しているということだと思います。したがって、0で始まる(MSBが設定されていない)4ビットに収まるすべての値が欠落しています。

また、値15も4ビットに収まるため、ここに値15を含める必要があることも指摘しておきます。したがって、2つの変更を加えると、コード行は次のようになります。

int randomChoice = choice.Next(0, (1 << input));

これにより、0から15までのすべての値が生成されます。

0 : 0000
1 : 0001
2 : 0010
3 : 0011
    ...
13: 1101
14: 1110
15: 1111

それはあなたが探しているものですか?

于 2012-12-25T20:31:00.400 に答える
2

前の質問で、元のコードを改善する回答を受け入れました。問題は、そもそもコードが間違っていたことです。ランダムなビットが1つだけ必要です。代わりに、次のようにする必要があります。

   int maxBit = AskUserForMaxBit();
   int randomBit = choice.Next(1, maxBit+1);
   int randomValue = 1 << (randomBit - 1);
   return Convert.ToString(randomValue, 2);
于 2012-12-25T21:18:44.813 に答える