1

我有 3 个子类“员工、教师、学生”,每个类都从父类人那里获取用户的第一个初始姓氏,在运行控制台应用程序时,向这个 id 添加 4 个随机数。我遇到的问题是所有类都获得相同的 4 位数字,我该如何解决这个问题,是的,它必须使用 Random 来完成,我不能使用静态计数器。

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

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

于 2010-08-02T14:21:49.833 回答
3

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

  1. 任何形式的哈希都不能保证唯一性
  2. 如果您确实需要唯一随机的 userId,那么您将需要使用更大的东西,例如 GUID,或者保留已发布的所有 UserId 的持久列表。

但是正如您在帖子中所建议的那样,恕我直言,一种理想的方式是使用跟踪上次发布的 UserId 的单例或存储(例如 SQL 身份)。

于 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

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

更多信息:

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

于 2010-08-02T14:23:55.427 回答