消除随机重复?

时间:2010-08-02 14:14:58

标签: c# random duplicate-removal

我有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();

Faculty.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);
        }


    }
}

Staff.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

5 个答案:

答案 0 :(得分:5)

我没有看到您宣布和初始化rnd的位置。我猜测它在Person中声明为实例成员,并在Person的构造函数中初始化 - 始终默认初始化,这意味着它使用时间作为种子,这意味着所有使用毫秒的调用都获得相同的种子。

使rnd成为静态成员,并在静态ctonstructor中初始化一次。

更新:这应该是所有需要的:

static readonly protected Random rnd = new Random();

(它也会更快,因为你只创建一个新的Random对象,而不是每个对象创建一次。从时钟创建种子的速度相当慢。)

答案 1 :(得分:3)

如果可以的话,建议重新考虑这个设计

  1. 任何形式的哈希都不能保证唯一性
  2. 如果您确实需要唯一随机的userIds,那么您将需要使用更大的内容,如GUID,或保留已发布的所有UserId的持久列表。
  3. 但正如您在帖子中所建议的那样,恕我直言的理想方式是使用单一或存储(例如SQL身份)跟踪上次发布的UserId。

答案 2 :(得分:1)

rnd静态并立即初始化,这应该是解决问题的最快方法。

据我所知rnd是你的基类中的protected / public field / property,所​​以让它静态会在你第一次访问你的Person类型时创建随机生成器。

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

public class PersonImpl : Person
{
    public void DoSomething()
    {
        int a = rnd.Next(100, 9999);
    }
}

答案 3 :(得分:0)

随机数需要种子才能开始 - 它只是一天结束时的公式。如果他们从同一个地方开始,他们会到达同一个地方。

这是一个教程:

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

答案 4 :(得分:0)

我认为,问题在于您紧密连续地初始化Random对象,并且因为系统时钟具有有限的分辨率,所以对象获得相同的种子。解决方案是对所有三个类使用相同的Random对象。

更多信息:

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