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

衝突なしで乱数を取得するために使用される主な方法は 3 つあります。

  1. 選択したすべての番号を保持して、以前のすべての番号に対して新しい番号を確認できるようにします。
  2. 一意の番号の範囲を作成し、それらをシャッフルして、結果から一度に 1 つ選択します。
  3. 衝突のリスクが無視できるほど小さいような巨大な乱数を作成します。

2 番目のアプローチは、トランプをシャッフルするのと同じ原理です。3 番目のアプローチは、基本的にランダムな 128 ビット値であるGUIDを作成するときに使用されます。

于 2013-04-17T10:28:20.117 に答える
0

Guid.NewGuid() または new Random().Next() を使用できます

于 2013-04-17T10:25:06.967 に答える
0

限られた範囲で一意の数値が必要であると仮定すると、1 つの (単純だが非効率的な) 方法は、可能なすべての値 (たとえば、0 ~ 99) のリストを作成することです。次に、System.Random を使用して、0 から (リスト内の要素数 - 1) の間でランダムに選択します。リストからそのインデックスを取得し、それを出力して要素を削除します。このプロセスを繰り返すと、その要素は生成できなくなり、すべての可能な値を使用するまで数値は一意になります。

于 2013-04-17T10:28:32.313 に答える