2012-03-21 44 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对象彼此靠近(在时间上),那么它将具有相同的种子)。由于随机不是忠实地随机的(如果从相同的种子初始化它,你会总是得到相同的序列后)你会得到相同的数字早在非静态版本。静态版本仅创建一次,你不断地问它的序列中的下一个数字,因此它似乎给你实际的随机数。

相关问题