class Program
    {
        class Rc
        {
            private int[] num = new int[100];            public bool rD(int ib) //判断之前是否有重复
            {
                for (int i = 0; i < 100; i++)
                {
                    if (num[i] == ib)
                    {
                        Console.Write(" {0}", i);//这里是为了方便看随机了几次
                        return true;    
                    }
                }
                return false;
 
            }
            public void rS()
            {
                Random r = new Random();
                int d =  r.Next(1, 100);
                for (int i = 0; i < 100; i++)
                {
                    while (rD(d))
                    {
                        d = r.Next(1, 101);
                    }
                    num[i] = d;
                    Console.Write("   \n num[{0}]={1}  \n", i, num[i]);
                }        
            }        }
        static void Main(string[] args)
        {
            Rc r = new Rc();
            r.rS();
            Console.Read();
        }
    }
1 到100的随机数不重复插入100个数组 结果的确是做到了,
但是我在想如果是要1 到 n 的随机数不重复插入 n 个数组
当这个n很大的时候 这个算法就很没效率了 由于是C# 尽量
不用指针能否有更效率的算法?
不行的话指针的算法也个我贴个吧。

解决方案 »

  1.   


    while (rD(d))
                        {
                            d = r.Next(1, 101);
                        }这里效率不好,我们可以试想一下,n很大的时候,越往后系统就越难随机到不与之前重复的数字,
    有可能出现接近死循环的等待情况,我希望能避免这种情况,请高手赐教。
      

  2.   

    class Rc2
            {
                private int[] num;
                private int n;
                public Rc2(int n)
                {
                    this.n = n;
                    num = new int[n];
                }
                public void rS()
                {
                    Random r = new Random();
                    int d = r.Next(1, n);
                    int temp;
                    for (int i = 0; i < n; i++)
                    {
                        num[i] = i + 1;
                    }
                    for (int i = 0; i < n; i++)
                    {
                        int b = r.Next(0, n);
                        temp = num[b];
                        num[b] = num[i];
                        num[i] = temp;
                        
                    }
                    for (int i = 0; i < n; i++)
                    {
                        Console.Write("\n num[{0}] = {1} ",i,num[i]);
                    }
                }晕死,楼上一句话就帮我把思路打开了,虽然之前没接触过洗牌算法。
    感谢...............
      

  3.   


    class Rc
            {
                private int[] num = null;
                private int MaxNumber = 0;
                private Hashtable ht = null;
                public Rc(int num)
                {
                    this.num = new int[num];
                    this.MaxNumber = num;
                    ht = new Hashtable(num);
                }            public bool Exists(int ib) //判断之前是否有重复
                {
                    if (ht.ContainsKey(ib))
                    {
                        return true;
                    }
                    else
                    {
                        ht.Add(ib, ib);
                        return false;
                    }
                }
                public void rS()
                {
                    Random r = new Random();
                    int d = r.Next(1, MaxNumber);
                    for (int i = 0; i < MaxNumber; i++)
                    {
                        while (this.Exists(d))
                        {
                            d = r.Next(1, MaxNumber + 1);
                        }
                        num[i] = d;
                        //Console.Write("   \n num[{0}]={1}  \n", i, num[i]);
                    }
                }        }
            static void Main(string[] args)
            {
                DateTime dt = DateTime.Now;
                Console.WriteLine(dt.ToString());
                Rc r = new Rc(300000);
                r.rS();
                TimeSpan ts = DateTime.Now.Subtract(dt);
                Console.WriteLine(ts.TotalMilliseconds);
                Console.Read();
            }
    改成这样,300000平均2000耗秒左右。你原来的30000的确是慢了。
      

  4.   

    我上面换成Hashtable,比你原来的for要快些。