产生无重复两位数,在多线程下也能产生无重复

解决方案 »

  1.   

    Just sample...用Queue或Stack可以保证无重复...
    class Program
    {
        public static void GetRandom(object q)
        {
            lock (q)
            {
                Console.Write("{0} ", ((Queue<int>)q).Dequeue());
            }
        }    static void Main(string[] args)
        {
            Queue<int> q = new Queue<int>();        Random rnd = new Random();        byte[] keys = new byte[90];
            rnd.NextBytes(keys);
            int[] items = new int[90];
            for (int i = 10; i < 100; i++)
            {
                items[i - 10] = i;
            }
            Array.Sort(keys, items);        foreach (var item in items)
            {
                q.Enqueue(item);
            }        Thread t1;
            Thread t2;
            Thread t3;        for (int i = 0; i < 30; i++)
            {
                t1 = new Thread(Program.GetRandom);
                t1.Start(q);            t2 = new Thread(Program.GetRandom);
                t2.Start(q);            t3 = new Thread(Program.GetRandom);
                t3.Start(q);
            }
        }
    }
      

  2.   


    先考慮一下單線程時如何產生不重復2位隨機數.
    產生隨機數的一個簡單辦法是線性同余法:x=(Ax+B)%M
    顯然生成的隨機數最大周期為M.但是想達到M,A,B不能任意取值,要符合以下條件:
    1.B,M互质; 
    2.M的任意质因子可以整除A − 1; 
    3.若M是4的倍数,A − 1也是; 
    4.A,B,X都比M小; 
    5.A,B是正整数
    由于樓主要求生成2位隨機數,另M=100,此時A=21,B=3即可符合條件.
    用此算法多線程生成隨機數時,不同線程間要共享變量x,需考慮同步問題.
    綜上,可得代碼:
            static void Main(string[] args)
            {
                Thread t1 = new Thread(new ThreadStart(GetRandom));
                Thread t2 = new Thread(new ThreadStart(GetRandom));
                t1.Start();
                t2.Start();
            }        class Random
            {
                public int Value = 0;
            }        static Random random=new Random();        static void GetRandom()
            {
                lock(random)
                {
                    while (true)
                    {
                        random.Value = (random.Value * 21 + 3) % 100;//生成隨機數random.Value
                        Console.WriteLine(random.Value);//可以看到,生成的數字在100個以內是不會有重復的.
                    }
                }
            }
      

  3.   

    lock(数组)
    {
        int a;
        do
        {
           a=生成随机数();
        }while(检查是否重复(a));
        将a放入数组;
    }