C# 消除随机重复?

C# 消除随机重复?,c#,random,duplicate-removal,C#,Random,Duplicate Removal,我有3个子类“Staff,Faculty,Student”,每个类都从父类person获取用户的第一个初始姓氏,在控制台应用程序运行时,要向该id添加4个随机数。我遇到的问题是,所有的类都得到了相同的4位数字。我如何解决这个问题?是的,必须使用随机计数器,我不能使用静态计数器 Person.cs“父类” 理工学院 namespace Person { public class Faculty : Person { public Faculty(string aTi

我有3个子类“Staff,Faculty,Student”,每个类都从父类person获取用户的第一个初始姓氏,在控制台应用程序运行时,要向该id添加4个随机数。我遇到的问题是,所有的类都得到了相同的4位数字。我如何解决这个问题?是的,必须使用随机计数器,我不能使用静态计数器

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

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

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

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

static readonly protected Random rnd = new Random();

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

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

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

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

static readonly protected Random rnd = new Random();

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

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

以下是一个教程:


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

以下是一个教程:


如果可以,您会建议重新考虑此设计

  • 任何形式的哈希都不能保证唯一性
  • 如果您确实需要唯一的随机用户标识,那么您将需要使用更大的东西,比如GUID,或者保留一个已发布的所有用户标识的持久列表

  • 但正如您在文章中所建议的,IMHO的理想方法是使用跟踪上次发布的用户ID的单例或存储(例如SQL标识)。

    如果可以,建议重新考虑此设计

  • 任何形式的哈希都不能保证唯一性
  • 如果您确实需要唯一的随机用户标识,那么您将需要使用更大的东西,比如GUID,或者保留一个已发布的所有用户标识的持久列表

  • 但正如您在文章中所建议的,IMHO的理想方法是使用跟踪上次发布的用户ID的单例或存储(例如SQL标识)。

    我认为,问题是,您可以连续初始化随机对象,因为系统时钟的分辨率有限,所以对象获得相同的种子。解决方案是对所有三个类使用相同的随机对象

    更多信息:


    我认为,问题在于,你会连续地初始化随机对象,因为系统时钟的分辨率有限,所以对象会得到相同的种子。解决方案是对所有三个类使用相同的随机对象

    更多信息:


    使
    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);
        }
    }
    

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

    你的Person实现在哪里,定义了
    rnd
    在哪里?你的Person实现在哪里,定义了
    rnd
    在哪里?如果OP不能使用静态计数器,我想知道他是否可以使用静态随机数()是的,静态计数器应该是更好的解决方案,但他说他需要它是随机数:)静态随机数工作,我不能使用静态计数器,因为我们现在在课堂上使用它,并且与其他人在同一页上我不能偏离太多。我想知道OP是否可以使用静态随机()如果他不能使用静态计数器。是的,静态计数器应该是更好的解决方案,但他说他需要它是随机的:)静态随机工作,我不能使用静态计数器,因为我们现在在课堂上使用它,并且与其他人在同一页上,我不能偏离太多。同意:1000-9999,伪随机,不会激发关于唯一性的信心。我会的,但这段代码来自课堂,应该为HW完成。同意:1000-9999,伪随机,不会激发关于唯一性的信心。我会的,但这段代码来自类,应该为HW完成它。这修复了受保护的静态随机rnd=new Random();谢谢大家的解释,非常感谢这个固定it保护静态随机rnd=new Random();谢谢大家的解释,非常感谢