c#中唯一的随机数

本文关键字:随机数 唯一 | 更新日期: 2023-09-27 18:09:51

我正在尝试创建一个具有唯一随机数的二叉搜索树。我用SortedSet来表示我的树然后我把它做成一个数组然后我用Contains来查看某个数字是否在树中。我的问题是,我不知道如何用一种简单的方法使所有的随机数不同。我使用了Unik和namatlen_unik方法但在这段代码中,它只生成1个数字到数组

        Random random = new Random();
        Program Tal = new Program();
        string nål = Tal.Nålen_Unik();
        string TalIArray = Tal.Unik();
        bool found = false;
        SortedSet<string> Tree = new SortedSet<string>();
        for (int x = 0; x < 50000; x++)
        {
            Tree.Add(TalIArray);
        }
        int y = 0;
        string[] TreeArray = Tree.ToArray<string>();
        while (y < TreeArray.Length)
        {
            Console.WriteLine(TreeArray[y]);
            y = y + 1;
        }
  private string Unik()
    {
        int maxSize = 4;
        char[] chars = new char[10000];
        string a;
        a = "0123456789";
        chars = a.ToCharArray();
        int size = maxSize;
        byte[] data = new byte[1];
        RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
        crypto.GetNonZeroBytes(data);
        size = maxSize;
        data = new byte[size];
        crypto.GetNonZeroBytes(data);
        StringBuilder result = new StringBuilder(size);
        foreach (byte b in data)
        {
            result.Append(chars[b % (chars.Length - 1)]);
        }
        return result.ToString();
    }
    private string Nålen_Unik()
    {
        int maxSize = 1;
        char[] chars = new char[62];
        string a;
        a = "0123456789";
        chars = a.ToCharArray();
        int size = maxSize;
        byte[] data = new byte[1];
        RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
        crypto.GetNonZeroBytes(data);
        size = maxSize;
        data = new byte[size];
        crypto.GetNonZeroBytes(data);
        StringBuilder result = new StringBuilder(size);
        foreach (byte b in data)
        {
            result.Append(chars[b % (chars.Length - 1)]);
        }
        return result.ToString();

c#中唯一的随机数

主要有三种方法可以获得无冲突的随机数:

  1. 保留您选择的所有号码,以便您可以检查新号码与所有以前的号码。
  2. 创建一系列唯一的数字,洗牌,每次从结果中选择一个。
  3. 创建一个如此巨大的随机数,以至于碰撞的风险很小,可以忽略不计。

第二种方法与洗牌的原理相同。第三种方法用于创建GUID,它基本上是一个随机的128位值。

你可以使用Random类和HashSet来保证没有重复项。

HashSet类提供高性能的集合操作。set是不包含重复元素的集合,其元素没有特定的顺序。

E。g:

HashSet<int> t = new HashSet<int>();
Random r = new Random();
while(t.Count < 50)//or the desired length of 't'
{
    t.Add(r.Next(0,1000));//adjust min/max as needed
}
foreach (int i in t)
{
    Console.WriteLine(i);
}
Console.Read();

将给你一个50个保证的唯一随机整数的集合。

由于集合中元素的数量不是这个问题的要求,因此似乎没有必要提及,尽管如果这个的要求,您可以简单地修改t.Count < ?行以获得所需长度的集合。

您可以使用guide . newguid()或new Random().Next()

假设您希望在有限范围内唯一的数字,一种(简单但可能效率低下的)方法是创建一个包含所有可能值的列表(例如,0-99)。然后使用System。随机在0和(列表中元素的数量- 1)之间随机选择一个。从列表中获取该索引,输出它并删除该元素。如果您重复该过程,则该元素将不再生成,并且数字将是唯一的,直到您使用了所有可能的值。

创建一个随机类实例。确保它是1 !

则使用此代码

private Random random = new Random();
random.Next();