1

私が書いたこのクラスは、コード/プロジェクトに含めるのに十分ですか(つまり、プロのやり方です)?それとも私は重要なことを見逃していますか?コンストラクターなどの使い方がわからないので、使用しませんでした(私はC#の初心者です)が、必要に応じてコメントしてください。

using System;
using System.Collections.Generic;
using System.Text;

namespace RandBit
{
    /// <summary>
    /// By: Author
    /// Version 0.0.1
    /// Pseudo-Random 16-Bit (Max) Generator.
    /// </summary>
    public class RandomBit
    {
        /// <param name="input">The Bit-size(int)</param>
        /// <returns>Random Bit of Bit-size(string)</returns>
        public static string Generate(int input)
        {
            int bitSize = 0;
            Random choice = new Random();
            if (input == 0 || input > 16)
            {
                bitSize = 0;
            }
            else if (input == 1)
            {
                bitSize = 1;
            }
            else
            {
                int randomChoice = choice.Next(0, (1 << input));
                bitSize = randomChoice;
            }
            string binary = Convert.ToString(bitSize, 2);
            binary = binary.PadLeft(input, '0');
            return binary;
        }
    }
}

ありがとう。

4

4 に答える 4

2

クラスには静的メンバーが1つしか含まれていないため、変更できるのは1つだけです。クラスを静的にしないでください。

于 2012-12-26T07:35:30.107 に答える
2

使い方がRandom間違っているようです。この件に関する Jon Skeet の記事から始めることをお勧めします。関連する引用:

同じ初期状態 (シードを介して提供可能) で Random のインスタンスを開始し、同じシーケンスのメソッド呼び出しを行うと、同じ結果が得られます。

では、サンプル コードのどこが間違っていたのでしょうか。ループの反復ごとに Random の新しいインスタンスを使用していました。Random のパラメーターなしのコンストラクターは、現在の日付と時刻をシードとして使用します。通常、現在の日付と時刻が変更されたことを内部タイマーが検出する前に、かなりの量のコードを実行できます。したがって、同じシードを繰り返し使用し、同じ結果を繰り返し得ています。

つまり、各呼び出しで の新しいインスタンスを作成してRandomいるため、戻り値が期待どおりに「ランダム」ではない可能性が大幅に増加しています。

.Net BCL には、より優れた PRNG クラスが既に存在する可能性があることにも言及する価値があります。同様のコードを記述する別の方法を次に示します。

private static readonly RNGCryptoServiceProvider _crypto = new RNGCryptoServiceProvider();

public static long Generate(){
    // use whatever size you want here; bigger has a better chance of 
    // being unique in a given scope
    byte[] bytes = new byte[8];

    // puts random bytes into the array
    _crypto.GetBytes( bytes );

    // do something (your choice) with the value...
    return BitConverter.ToInt64( bytes, 0 );
}
于 2012-12-26T07:37:34.097 に答える
1

私がプロジェクト チームのリーダーだったら、要約/作成者/バージョンのコメントを削除するように要求します。それらは冗長で (ソース管理にその情報があります)、書き込み/変更に時間がかかり、あいまいです (作成者である 7 人によって変更されたファイルでは?)。

このトピックに関する議論は、おそらく唯一のものではありません: https://softwareengineering.stackexchange.com/q/48562/30927

于 2012-12-26T07:45:07.773 に答える
0

変数「Choice」をその使用箇所の近く、つまりelseループ内に移動します。そうしないと、使用されていない場合でも、Random オブジェクトに不要なメモリが割り当てられます。こちらをご覧ください

于 2012-12-26T08:46:02.060 に答える