生成一定范围内的互不相同的随机数的方法比较
2014-03-11 23:56
267 查看
实现原理:
方法1:使用list,通过list.contains()作为循环判断的条件,实现无重复的add
方法2:使用两组数组,all存储所有可取值,result存储结果,result依次从all中取值,all长度递减,通过索引实现all中始终保持取完后剩下的元素
分析:法1在最坏情况下会重复循环,法2通过保证每次都能取到值,很大程度上提高了效率
代码比较:
运行结果:
方法1在很多情况下耗时根本无法接受。。。
方法1:使用list,通过list.contains()作为循环判断的条件,实现无重复的add
方法2:使用两组数组,all存储所有可取值,result存储结果,result依次从all中取值,all长度递减,通过索引实现all中始终保持取完后剩下的元素
分析:法1在最坏情况下会重复循环,法2通过保证每次都能取到值,很大程度上提高了效率
代码比较:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namespace 基本语法 { class Program { static void Main(string[] args) { Stopwatch watch = new Stopwatch(); watch.Start(); List<int> list = _GetRandom(20, 500, 400); watch.Stop(); int ctrl = 0; foreach (int i in list) { Console.Write("{0} ", i); ++ctrl; if (ctrl % 20 == 0) Console.WriteLine(); } Console.WriteLine("\nMethod 1 time used:{0}", watch.Elapsed); watch.Reset(); watch.Start(); int[] ia = GetRandom(20, 500, 400); watch.Stop(); ctrl = 0; foreach (int i in ia) { Console.Write("{0} ", i); ++ctrl; if (ctrl % 20 == 0) Console.WriteLine(); } Console.WriteLine("\nMethod 2 time used:{0}", watch.Elapsed); } /// <summary> /// 使用list容器产生一定范围内互不相同的随机数 /// </summary> /// <param name="minVal">最小值</param> /// <param name="maxVal">最大值</param> /// <param name="amount">随机数总数</param> /// <returns>返回list<int></returns> static List<int> _GetRandom(int minVal, int maxVal, int amount) { List<int> list = new List<int>(); while (list.Count != amount) { Random random = new Random((int)DateTime.Now.Ticks); int temp = random.Next(minVal, maxVal); if (!list.Contains(temp)) list.Add(temp); } return list; } /// <summary> /// 使用数组方法实现 /// </summary> /// <param name="minVal"></param> /// <param name="maxVal"></param> /// <param name="amout"></param> /// <returns>返回int[]</returns> static int[] GetRandom(int minVal, int maxVal, int amout) { int[] result = new int[amout]; int[] all = new int[maxVal-minVal+1]; for (int ix = 0; ix!=amout;++ix ) { all[ix] = minVal + ix; } Random random = new Random(); int allNum = all.Length; for (int ix = 0; ix != amout;++ix ) { int index=random.Next(allNum); result[ix] = all[index]; all[index] = all[--allNum]; } return result; } } }
运行结果:
方法1在很多情况下耗时根本无法接受。。。
相关文章推荐
- 生成一定范围内的互不相同的随机数的方法比较
- C#生成互不相同随机数的实现方法
- javascript生成一定范围值内的随机数
- Java编程实现从给定范围内随机N个不重复数生成随机数的方法小结
- 生成一定范围内的真随机数
- C++在一定范围内生成不重复随机数序列
- C++中生成任意范围内随机数的方法
- 生成一定范围的随机数
- Python生成一定范围内指定数目的无重复随机数
- Java编程实现生成给定范围内不重复随机数的方法小结
- C#生成设置范围内的Double类型随机数的方法
- Python生成任意范围任意精度的随机数方法
- 在一定范围内生成随机数
- 生成随机数,且每个数一定不相同
- 生成k个小于n的互不相同的随机数
- C#在一段数字区间内随机生成若干个互不相同的随机数
- 生成互不相同随机数的两种算法
- java生成一定范围随机数
- 【Java】利用Collections类下的shuffle洗牌方法改进在一定的范围内产生不重复的随机数
- 生成范围内的不相同的随机数