我似乎遇到了编程ID部分的问题。每当我运行它时,它会说学生ID是0.我试着把它称为1000到9999之间的随机数字。有人可以告诉我我哪里出错了以及如何修复它?
class Program
{
static void Main(string[] args)
{
List<Student> myList = new List<Student>();
Student s1 = new Student();
s1.firstName = "John";
s1.lastName = "Smith";
s1.sID = 2560;
myList.Add(s1);
Student s2 = new Student("Peter ");
myList.Add(s2);
Student s3 = new Student("John", "Smith");
myList.Add(s3);
Student s4 = new Student("Peter", "Pines");
myList.Add(s4);
Student s5 = new Student("Morgan", "Simmons");
myList.Add(s5);
Student s6 = new Student("James", "Walters");
myList.Add(s6);
Student s7 = new Student("Linda", "Scott", 1005);
myList.Add(s7);
Console.WriteLine();
Console.WriteLine("Total students: {0}", Student.Count);
}
class Student
{
private static int count = 0;
private string v;
private int v1;
private static readonly Random rnd = new Random();
public string FirstName { get; private set; }
public string LastName { get; private set; }
public Student(string first, string last)
{
FirstName = first;
LastName = last;
count++;
sID = sID;
Console.WriteLine("Student Name: {0} {1}; Student ID {3}; count = {2}",
FirstName, LastName, Count, sID);
}
public Student()
{
}
public Student(string v)
{
this.v = v;
}
public Student(string first, string last, int v1) : this(first, last)
{
this.v1 = v1;
}
public static int Count
{
get
{
return count;
}
}
public static int SID
{
get
{
return sID;
}
}
public string firstName { get; internal set; }
public string lastName { get; internal set; }
public int sID { get; internal set; }
}
答案 0 :(得分:4)
int
的默认值为0,使用该知识再次查看您的代码...
你有一个Random类实例,但是你在使用它吗?
答案 1 :(得分:4)
正如其他人指出的那样,你在构造函数中sID = sID;
而不是调用Random
。
正如对此方法的一般性评论一样,如果您对ID实际上是独一无二的感兴趣,请参阅this post,了解为什么您不能依赖随机数进行唯一。有两个问题:Birthday Paradox和Gambler's Fallacy。
生日悖论说,它之前需要的数量非常少,而且可能是重复的;在32位随机数的情况下,它最终是大约65K的数字,然后你更有可能没有重复。但是,由于您只使用1000 - 9999(8999个数字),这略大于2 ^ 13.135,因此生日悖论表明在它之前需要大约sqrt(2 ^ 13.135)(大约95)个数字&# 39;同样可能没有那么重复 - 再次,这是一个非常小的数字。
在生成2^32 + 1
个数字时,对于32位数字,must be at least one duplicate为{{3}}。对于值1000 - 9999,一旦生成9,000个数字,您必须至少有一个副本。
赌徒的谬误指的是(错误的)独立事件以某种方式相互影响的信念。例如,如果您在对5
的一次特定通话中生成Random
,则您在下次通话时不太可能生成5
。这不是真的 - 你实际上实际上可能在下次通话中产生另外5个,因为你正在通话中实际产生了5。
在实践中,如果您只进行5次通话,并且该ID只需要对于该特定而言是唯一的&#34;运行&#34;在该应用中,为5个随机数生成重复的实际概率相对较低(但并非不可能)。如果您需要ID在应用程序中是唯一的,那么#34;运行&#34;和/或你开始更频繁地调用它,但这很快就会变得非常棘手。
答案 2 :(得分:3)
如果你打电话给随机数发生器
,也许会有所帮助public Student(string first, string last)
{
FirstName = first;
LastName = last;
count++;
sID = rnd.Next(1000, 10000); // to get values between 1000 and 9999
Console.WriteLine("Student Name: {0} {1}; Student ID {3}; count = {2}",
FirstName, LastName, Count, sID);
}
无论如何,您应该注意您的ID不会是唯一的。
答案 3 :(得分:1)
正如@maccettura所指出的那样,你没有为x
类的sId
分配值。
如果你想确保ID真的是唯一的(尽管随机可以多次生成相同的数字),你可以考虑从Student
更改为int
并使用Guid生成器.net框架。 E.g。
string
这会生成 string sId = Guid.NewGuid().ToString()
答案 4 :(得分:0)
在构造函数中,您将ID分配给自身(sID = sID;
)
您应该使用Random
- 这样的对象:
sID = rnd.Next(1000, 10000);