请编程实现:产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复(百度了一下,get一种高性能算法,非递归)

来源:互联网 发布:网络买卖纠纷 编辑:程序博客网 时间:2024/04/28 04:34
网上找到一种更好的实现方式:

(1)把N个数放到容器A(int数组)中.

(2)从N个数中随机取出1个数放入容器B(int数组)中.

(3)把容器A中最后一个数与随机抽取的数对调 或者 把容器A中最后一个数覆盖随机抽取出来的数.

(4)这时从容器A(假设N个数,索引0 到 索引N-2)之间随机取一个数.再放入容器B中,重复此步骤.

说明:也就是第二次是从容器A中 第一个元素到倒数第二个元素 中随机取一个数.

这种好处是,随机数所取范围逐步缩小,而且杜绝了大数据时集合执行删除操作时产生的瓶颈.

 1 namespace Wolfy.RandomDemo 2 { 3     class Program 4     { 5         static void Main(string[] args) 6         { 7             int[] result = GetRandom(100); 8             for (int i = 0; i < result.Length; i++) 9             {10                 Console.WriteLine(result[i]);11             }12             Console.WriteLine("over:" + result.Length);13             Console.Read();14         }15         /// <summary>16         /// 获得无重复随机数组17         /// </summary>18         /// <param name="n">上限n</param>19         /// <returns>返回随机数组</returns>20         static int[] GetRandom(int n)21         {22             //容器A和B23             int[] arryA = new int[n];24             int[] arryB = new int[n];25             //填充容器a26             for (int i = 0; i < arryA.Length; i++)27             {28                 arryA[i] = i + 1;29             }30             //随机对象31             Random r = new Random();32             //最后一个元素的索引 如n=100,end=9933             int end = n - 1;34             for (int i = 0; i < n; i++)35             {36                 //生成随机数 因为随机的是索引 所以从0到100取,end=10037                 //一个大于等于 minValue 且小于 maxValue 的 32 位带符号整数,即:  返回的值范围包括 minValue 但不包括 maxValue。 38                 //如果 minValue 等于 maxValue,则返回 minValue39                 //40                 int minValue = 0;41                 int maxValue = end + 1;42                 int ranIndex = r.Next(minValue, maxValue);43                 //把随机数放在容器B中44                 arryB[i] = arryA[ranIndex];45                 //用最后一个元素覆盖取出的元素46                 arryA[ranIndex] = arryA[end];47                 //缩减随机数生成的范围48                 end--;49             }50             //返回生成的随机数组51             return arryB;52         }53     }54 }

 

0 0
原创粉丝点击