0

我正在尝试创建具有唯一随机数的二叉搜索树。我使用 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();
4

5 回答 5

3

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

  1. 保留您选择的所有号码,以便您可以对照之前的所有号码检查新号码。
  2. 创建一系列独特的数字,将它们随机排列,然后从结果中一次选择一个。
  3. 创建一个如此巨大的随机数,以至于碰撞的风险非常小,可以忽略不计。

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

于 2013-04-17T10:28:20.117 回答
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 < ?以获得一组所需长度。

于 2013-04-17T10:26:12.793 回答
0

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

于 2013-04-17T10:28:32.313 回答
0

您可以使用 Guid.NewGuid() 或 new Random().Next()

于 2013-04-17T10:25:06.967 回答
-1

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

然后使用此代码

private Random random = new Random();

random.Next();
于 2013-04-17T10:22:56.510 回答