1

私は3つのサブクラス「Staff、Faculty、Student」を持っています。各クラスは、親クラスの人からユーザーの最初の最初の姓を取得しています。このIDには、コンソールアプリケーションの実行時に4つの乱数を追加するのが好きです。私が抱えている問題は、すべてのクラスが同じ 4 桁を取得していることです。どうすればこれを修正できますか?はい、静的カウンターを使用できないランダムを使用して行う必要があります。

Person.cs「親クラス」

public class Person
    {
        static string title;
        protected string firstName;
        protected string lastName;
        protected string address;
        protected string gender;
        protected string dateOfBirth;
        protected string userID;
        protected Random rnd = new Random();

教員.cs

namespace Person
{
    public class Faculty : Person
    {
        public Faculty(string aTitle, string aFirstName, string aLastName, string aAddress,
           string aGender, string aDateOfBirth)
            : base(aTitle, aFirstName, aLastName, aAddress,
                    aGender, aDateOfBirth)
        {


            this.userID = firstName.Substring(0, 1) + lastName.Substring(0, 5);

            this.userID = this.userID + rnd.Next(1000, 9999);

            Console.WriteLine(this.userID);
        }


    }
}

スタッフ.cs

namespace Person
{
    public class Staff : Person
    {
        public Staff(string aTitle, string aFirstName, string aLastName, string aAddress,
           string aGender, string aDateOfBirth)
            : base(aTitle, aFirstName, aLastName, aAddress,
                    aGender, aDateOfBirth)
        {

            this.userID = firstName.Substring(0, 1) + lastName.Substring(0, 5);

            this.userID = this.userID + rnd.Next(1000, 9999);

            Console.WriteLine(userID);
        }


    }
}

テストクラス

   public class PersonTest
    {
       static void Main(string[] args) 
      {
          Person testPerson = new Faculty(" Mr.", "Merry ", "Lanes", " 493 Bluebane RD", "Male", " 8-06-1953\n ");


          Person studentPerson = new Student(" Mr.", "Jerry ", "Panes", " 456 Greenbane RD", "Male", " 8-10-1945\n");


          Person staffPerson = new Staff(" Mr.", "Joe ", "Gaines", " 495 Redbane RD", "Male", " 8-21-1989\n ");


            Console.ReadLine();
        }//end main
4

5 に答える 5

5

を宣言および初期化している場所がわかりませんrnd。Person でインスタンス メンバーとして宣言され、Person のコンストラクターで初期化されていると推測します。常にデフォルトで初期化されます。つまり、時間をシードとして使用します。つまり、ミリ秒単位の呼び出しはすべて同じシードを取得します。

rnd静的メンバーを作成し、静的 ctonstructor で一度初期化します。

更新:必要なのはこれだけです:

static readonly protected Random rnd = new Random();

(オブジェクトごとに 1 回ではなく、新しい Random オブジェクトを 1 回だけ作成するため、高速になります。クロックからシードを作成するのはかなり遅くなります。)

于 2010-08-02T14:21:49.833 に答える
3

可能であれば、このデザインを再考することをお勧めします

  1. 任意の形式のハッシュは一意性を保証できません
  2. 一意にランダムな userId が必要な場合は、GUID などのより大きなものを使用するか、既に発行されているすべての UserId の永続的なリストを保持する必要があります。

しかし、投稿で提案しているように、私見では、最後に発行された UserId を追跡するシングルトンまたはストレージ (SQL ID など) を使用するのが理想的です。

于 2010-08-02T14:22:54.990 に答える
1

静的rndにしてすぐに初期化します。これは、問題に対するこれまでで最も迅速な解決策になるはずです。

私が理解しているように、rndは基本クラスの保護/パブリックフィールド/プロパティであるため、静的にすると、 Person タイプの最初のアクセス時にランダムジェネレーターが作成されます。

public class Person
{
    protected static Random rnd = new Random();
}

public class PersonImpl : Person
{
    public void DoSomething()
    {
        int a = rnd.Next(100, 9999);
    }
}
于 2010-08-02T14:26:21.510 に答える
0

乱数を開始するにはシードが必要です。これは結局のところ、単なる数式です。同じ場所から出発すれば、同じ場所に到着します。

ここにチュートリアルがあります:

https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5663283.html

于 2010-08-02T14:22:26.503 に答える
0

問題は、ランダムオブジェクトを連続して初期化し、システムクロックの解像度が有限であるため、オブジェクトが同じシードを取得することだと思います。解決策は、3 つのクラスすべてに同じ Random オブジェクトを使用することです。

詳しくは:

http://msdn.microsoft.com/en-us/library/system.random.aspx

于 2010-08-02T14:23:55.427 に答える