0

長さ 9 のランダムな文字列を生成したい。

10~15回程度衝突するコードです。同じ文字列を返すランダム文字列ジェネレーターの功績。本当にランダムな文字列を生成するのを手伝ってくれる人はいますか?

  class Program
    {

        private static Random random = new Random((int)DateTime.Now.Ticks);
        private static object locker = new object();

        private static string RandomString(int size)
        {
            StringBuilder builder = new StringBuilder();
            char ch;
            for (int i = 0; i < size; i++)
            {
                lock (locker)
                {
                    ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
                }
                builder.Append(ch);
            }

            return builder.ToString();
        }



        static void Main(string[] args)
        {            
            Dictionary<string, string> dict = new Dictionary<string, string>();
            object locker2 = new object();

            ThreadPool.QueueUserWorkItem(new WaitCallback((obj) => {
                for (int i = 0; i < 5000000; i++)
                {
                    string random = RandomString(9);
                    lock (locker2)
                    {
                        if (!dict.ContainsKey(random))
                            dict[random] = random;
                        else
                            Console.WriteLine("Found");
                    }

                }
            }));

            ThreadPool.QueueUserWorkItem(new WaitCallback((obj) =>
            {
                for (int i = 0; i < 5000000; i++)
                {
                    string random = RandomString(9);
                    lock (locker2)
                    {
                        if (!dict.ContainsKey(random))
                            dict[random] = random;
                        else
                            Console.WriteLine("Found");
                    }

                }
            }));

            ThreadPool.QueueUserWorkItem(new WaitCallback((obj) =>
            {
                for (int i = 0; i < 5000000; i++)
                {
                    string random = RandomString(9);
                    lock (locker2)
                    {
                        if (!dict.ContainsKey(random))
                            dict[random] = random;
                        else
                            Console.WriteLine("Found");
                    }

                }
            }));

            ThreadPool.QueueUserWorkItem(new WaitCallback((obj) =>
            {
                for (int i = 0; i < 5000000; i++)
                {
                    string random = RandomString(9);
                    lock (locker2)
                    {
                        if (!dict.ContainsKey(random))
                            dict[random] = random;
                        else
                            Console.WriteLine("Found");
                    }

                }
            }));

            Console.ReadKey();
        }
    }
4

3 に答える 3

1

制約のない完全にランダムな文字列を使用している場合でも、約200万のエントリを生成すると、衝突が発生する可能性があります。合計26^9の文字列があります。その平方根(約230万)にぶつかると、衝突が発生する可能性が高くなります。誕生日の問題をチェックしてください。

いくつかの選択肢があります。

  • 可能な文字列の数を大幅に増やします。これは、文字列が長くなり、場合によっては文字数が増えることを意味します
  • 既存の値を追跡し、それらを拒否します。
  • カウンターを使用して、目的のサイズの疑似ランダム順列に渡します。
于 2012-08-16T10:08:54.583 に答える
0

GUIDを使用して、それを好みの文字列に圧縮します。

于 2012-08-16T09:24:03.907 に答える
0

それも同様に機能する可能性がありますが、真の乱数が必要な場合は、RandomNumberGeneratorクラスを使用する必要があります。これにより、暗号化された乱数が得られ、ランダム性をより適切に分散できます。もちろん、これは暗号ランダム文字列が必要な場合にのみ重要です。このSOの質問は、違いについて議論するのに適しています。

于 2012-08-16T09:16:58.377 に答える