产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
2015-03-08 13:25
513 查看
写在前面
前天去面试了,给出的笔试中有这样的一道算法题,产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复当时,脑子一热,也没想那么多,就用集合实现了一下,经面试官提醒,发现还有更好的方式来实现。
代码
首先看一下这样一段代码namespace Wolfy.RandomDemo { class Program { static void Main(string[] args) { List<int> lst = new List<int>(); Random r = new Random(); while (true) { int temp = r.Next(1, 101); if (lst.Count == 100) { break; } if (!lst.Contains(temp)) { lst.Add(temp); } } for (int i = 0; i < lst.Count; i++) { Console.WriteLine(lst[i]); } Console.Read(); } } }
虽然上面的代码,实现题目的要求,但是如果是1到100万或者更大,这样的每次判断是否包含这样的一个数,势必会影响到性能。
网上找到一种更好的实现方式:
(1)把N个数放到容器A(int数组)中.
(2)从N个数中随机取出1个数放入容器B(int数组)中.
(3)把容器A中最后一个数与随机抽取的数对调 或者 把容器A中最后一个数覆盖随机抽取出来的数.
(4)这时从容器A(假设N个数,索引0 到 索引N-2)之间随机取一个数.再放入容器B中,重复此步骤.
说明:也就是第二次是从容器A中 第一个元素到倒数第二个元素 中随机取一个数.
这种好处是,随机数所取范围逐步缩小,而且杜绝了大数据时集合执行删除操作时产生的瓶颈.
代码实现
namespace Wolfy.RandomDemo { class Program { static void Main(string[] args) { int[] result = GetRandom(100); for (int i = 0; i < result.Length; i++) { Console.WriteLine(result[i]); } Console.WriteLine("over:" + result.Length); Console.Read(); } /// <summary> /// 获得无重复随机数组 /// </summary> /// <param name="n">上限n</param> /// <returns>返回随机数组</returns> static int[] GetRandom(int n) { //容器A和B int[] arryA = new int ; int[] arryB = new int ; //填充容器a for (int i = 0; i < arryA.Length; i++) { arryA[i] = i + 1; } //随机对象 Random r = new Random(); //最后一个元素的索引 如n=100,end=99 int end = n - 1; for (int i = 0; i < n; i++) { //生成随机数 因为随机的是索引 所以从0到100取,end=100 //一个大于等于 minValue 且小于 maxValue 的 32 位带符号整数,即:返回的值范围包括 minValue 但不包括 maxValue。 //如果 minValue 等于 maxValue,则返回 minValue // int minValue = 0; int maxValue = end + 1; int ranIndex = r.Next(minValue, maxValue); //把随机数放在容器B中 arryB[i] = arryA[ranIndex]; //用最后一个元素覆盖取出的元素 arryA[ranIndex] = arryA[end]; //缩减随机数生成的范围 end--; } //返回生成的随机数组 return arryB; } } }
总结
实现方式有很多种,但是如果能用高效的方式就用高效的方式实现。这种生成无重复的随机数,可以在运用在抽奖系统中。相关文章推荐
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
- 【转】产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
- 关于一道 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。自己写的算法
- a 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复 的另一种写法
- java笔试题---程序产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
- 请编程实现:产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复(百度了一下,get一种高性能算法,非递归)
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
- 数组问题:产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
- 温故知新--数组(产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。)
- 用c# 产生一个 int 数组 长度为100,并向其中随机插入 1-100 ,并且不能重复
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复