2012-03-21 28 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); 
    } 

爲什麼我總是得到相同的號碼,但如果我做了隨機對象靜態它生成/分配新的號碼。不知道我的邏輯有問題。爲什麼我需要使Random對象靜態,如果我從構造函數中調用它的話?

+2

每'Random'實例生成數字的對於給定的種子的相同序列。你永遠不會種子你的,所以它總是使用默認值,並給出相同的數字。 – Cameron 2012-03-21 21:31:59

+0

感謝所有的意見我認爲種子不重置每一次我叫下一個方法,認錯了 – Marin 2012-03-22 05:01:39

回答

1

如果您在構造函數中不斷創建新的Random對象,它將重置種子(如果您不提供參數,則種子設置爲當前時間(請參閱:MSDN: Random constructor) - 所以如果您創建多個Random對象彼此靠近(在時間上),那麼它將具有相同的種子)。由於隨機不是忠實地隨機的(如果從相同的種子初始化它,你會總是得到相同的序列後)你會得到相同的數字早在非靜態版本。靜態版本僅創建一次,你不斷地問它的序列中的下一個數字,因此它似乎給你實際的隨機數。

相關問題