1

ここで行っているよりも、ビットサイズの選択と疑似ランダムバイナリビットの生成を行うためのより洗練された方法はありますか?実際には、生成されたランダムバイナリビットのビットサイズ(最大16ビット)をユーザーが制御できるアルゴリズムを作成する必要があります。これは私が書いた関数ですが、これが最小/最もエレガントかどうかはわかりません。これは科学的なものであるため、効率はそれほど重要ではありませんが、コードの優雅さとわかりやすさは重要です。それで、同じことをするより効率的でエレガントな方法はありますか?

static string randomBit() {
    int bitSize = 0, input = 0;
    Console.Write("Input Bit Size (Maximum is 16 Bit): ");
    input = Convert.ToInt32(Console.ReadLine());
    Random choice = new Random();
    if(input == 0 || input > 16) {
        bitSize = 0;
    }
    else if(input == 1) {
        bitSize = 1;
    }
    else if(input == 2) {
        int randomChoice = choice.Next(2, 3);
        bitSize = randomChoice;
    }
    else if(input == 3) {
        int randomChoice = choice.Next(4, 7);
        bitSize = randomChoice;
    }
    else if(input == 4) {
        int randomChoice = choice.Next(8, 15);
        bitSize = randomChoice;
    }
    else if(input == 5) {
        int randomChoice = choice.Next(16, 31);
        bitSize = randomChoice;
    }
    else if(input == 6) {
        int randomChoice = choice.Next(32, 63);
        bitSize = randomChoice;
    }
    else if(input == 7) {
        int randomChoice = choice.Next(64, 127);
        bitSize = randomChoice;
    }
    else if(input == 8) {
        int randomChoice = choice.Next(128, 255);
        bitSize = randomChoice;
    }
    else if(input == 9) {
        int randomChoice = choice.Next(256, 511);
        bitSize = randomChoice;
    }
    else if(input == 10) {
        int randomChoice = choice.Next(512, 1023);
        bitSize = randomChoice;
    }
    else if(input == 11) {
        int randomChoice = choice.Next(1024, 2047);
        bitSize = randomChoice;
    }
    else if(input == 12) {
        int randomChoice = choice.Next(2047, 4095);
        bitSize = randomChoice;
    }
    else if(input == 13) {
        int randomChoice = choice.Next(4096, 8191);
        bitSize = randomChoice;
    }
    else if(input == 14) {
        int randomChoice = choice.Next(8192, 16383);
        bitSize = randomChoice;
    }
    else if(input == 15) {
        int randomChoice = choice.Next(16384, 32767);
        bitSize = randomChoice;
    }
    else if(input == 16) {
        int randomChoice = choice.Next(32768, 65535);
        bitSize = randomChoice;
    }
    string binary = Convert.ToString(bitSize, 2);
    return binary;
}

また、2番目の質問として、コードがビットサイズを要求しているときにEnterキーを2回押すと、例外エラーが返されます。同じことを回避する方法はありますか?

4

1 に答える 1

0

まず第一に、私はあなたがif /elseステートメントの数を減らすことができると本当に思います:

private static string randomBit()
{
    int bitSize = 0, input = 0;
    Console.Write("Input Bit Size (Maximum is 16 Bit): ");
    input = Convert.ToInt32(Console.ReadLine());
    Random choice = new Random();

    if (input <= 0 || input > 16)
    {
        bitSize = 0;
    }
    else if(input == 1)
    {
        bitSize = 1;
    }
    else
    {                        
        int randomChoice = choice.Next(1 << (input-1), (1 << input)-1);
        bitSize = randomChoice;
    }

    string binary = Convert.ToString(bitSize, 2);
    return binary;
}

この式の左シフトに慣れていない場合:int randomChoice = choice.Next(1 << (input-1), (1 << input)-1);読みやすさにもっと興味がある場合は、いつでも次のように置き換えることができます。

int randomChoice = choice.Next(Math.Pow(2, input - 1), Math.Pow(2, input) - 1);

例外に関する質問に関しては、答えはイエスです。Convert.ToInt32あなたが持っている問題は、関数への入力を検証しないことです。

あなたの代わりにinput = Convert.ToInt32(Console.ReadLine());書くことができます:

do
{
   string inputString = Console.ReadLine();
   if(!Int32.TryParse(inputString, out input))     // will return false if it can't convert
   {
       Console.WriteLine("Please enter a number between 1 and 16!");
       input = 0;
   }
}while(input == 0);
于 2012-12-25T19:04:39.453 に答える