C#随机化ID

时间:2017-03-07 18:05:26

标签: c# random

我似乎遇到了编程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; }
}

5 个答案:

答案 0 :(得分:4)

int的默认值为0,使用该知识再次查看您的代码...

你有一个Random类实例,但是你在使用它吗?

答案 1 :(得分:4)

正如其他人指出的那样,你在构造函数中sID = sID;而不是调用Random

正如对此方法的一般性评论一样,如果您对ID实际上是独一无二的感兴趣,请参阅this post,了解为什么您不能依赖随机数进行唯一。有两个问题:Birthday ParadoxGambler'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);