C#中的唯一随机数

时间:2013-04-17 10:18:57

标签: c# binary-search-tree

我正在尝试使用唯一的随机数创建二叉搜索树。我使用SortedSet来表示我的树,然后我将它变成一个数组,然后我使用Contains来查看树中是否有某个数字。我的问题是我无法弄清楚如何以一种简单的方式获得所有随机数。我使用了Unik和Nålen_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();

5 个答案:

答案 0 :(得分:3)

主要有三种方法用于获取没有冲突的随机数:

  1. 保留您选择的所有号码,以便您可以检查以前所有号码的新号码。
  2. 创建一系列唯一数字,对其进行随机播放,然后从结果中一次选择一个。
  3. 创建一个巨大的随机数,以确保碰撞的风险很小,可以忽略不计。
  4. 第二种方法与改组一副纸牌的原理相同。在创建GUID时使用第三种方法,它基本上是一个随机的128位值。

答案 1 :(得分:2)

您可以使用Random课程和HashSet来保证不会有重复的内容。

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

例如:

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 < ?修改为获得一组所需的长度。

答案 2 :(得分:0)

您可以使用Guid.NewGuid()或新的Random()。Next()

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

创建一个Random类的实例。确保它是一个!

然后使用此代码

private Random random = new Random();

random.Next();