2012-03-21 7 views
0
class Student 
{ 
    private string FirstName { get; set; } 
    private string LastName { get; set; } 
    private int age { get; set; } 
    private int studentID { get; set; } 
    private static int count = 0; 
    **static Random randomNumber = new Random(); // works** 
    **Random randomNumber = new Random(); // doesn't work I get the same studentID number** 
    public Student()// constructor 
    { 

     this.studentID = randomNumber.Next(1000000, 100000000); 
     count++; 
     Console.WriteLine("count {0} studentID {1}", count, studentID); 
    } 

    public Student(string first, string last, int age) 
    { 

     this.studentID = randomNumber.Next(1000000, 100000000); 
     count++; 
     Console.WriteLine("count {0} studentID {1}", count, studentID); 
     this.FirstName = first; 
     this.LastName = last; 
     this.age = age; 
    } 
    ...... continuation 

    a few get methods 

    ...... continuation 

    public void PrintData() 
    { 
     Console.WriteLine("Name is {0}, Lastname is {1} , Age is {2} , studentID is {3}", FirstName, LastName, age, this.studentID); 
    } 

同じ番号を取得し続けるのはなぜですか?ランダムオブジェクトを静的にすると、新しい番号が生成され/割り当てられます。私の論理がどこに欠陥があるのか​​分からない。コンストラクタから呼び出すと、ランダムオブジェクトを静的にする必要があるのはなぜですか?

+2

すべての「ランダム」インスタンスは、与えられたシードに対して同じ一連の番号を生成します。あなたはあなたに種を蒔くことはないので、常にデフォルトを使い、同じ数字を与えます。 – Cameron

+0

すべてのコメントのおかげで、私は、シードが毎回リセットされていないと思っていました。 – Marin

答えて

1

コンストラクタで新しいRandomオブジェクトを作成し続けると、シードがリセットされます(引数を指定しないと、シードは現在の時刻に設定されます(MSDN: Random constructor参照)。お互いに近く(時間的に)、同じ種子を持つでしょう)。ランダムは本当にランダムではないので(同じシードからそれを初期化すると、常に同じシーケンスが返されます)、非静的バージョンでは同じ数字が返されます。静的バージョンは一度だけ作成され、シーケンス内の次の番号を要求し続けるため、実際の乱数が表示されます。

関連する問題