C# 消除随机重复?
我有3个子类“Staff,Faculty,Student”,每个类都从父类person获取用户的第一个初始姓氏,在控制台应用程序运行时,要向该id添加4个随机数。我遇到的问题是,所有的类都得到了相同的4位数字。我如何解决这个问题?是的,必须使用随机计数器,我不能使用静态计数器 Person.cs“父类” 理工学院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
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();
(这也会更快,因为你只创建一个新的随机对象一次,而不是为每个对象创建一次。从时钟创建种子相当慢。)随机数需要一个种子才能开始-这只是一天结束时的一个公式。如果他们从同一个地方出发,他们就会到达同一个地方 以下是一个教程:
随机数需要一粒种子才能开始——这只是一天结束时的一个公式。如果他们从同一个地方出发,他们就会到达同一个地方 以下是一个教程:
如果可以,您会建议重新考虑此设计
但正如您在文章中所建议的,IMHO的理想方法是使用跟踪上次发布的用户ID的单例或存储(例如SQL标识)。如果可以,建议重新考虑此设计
但正如您在文章中所建议的,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();谢谢大家的解释,非常感谢