生成一定范围内的互不相同的随机数的方法比较
2013-05-20 22:21
471 查看
实现原理:
方法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#生成互不相同随机数的实现方法
- Lua生成比较理想的随机数的方法
- 生成一定范围内的随机数
- 生成互不相同的随机数
- C#在一段数字区间内随机生成若干个互不相同的随机数
- 生成互不相同的N个随机数
- 用C#生成足够随机的互不相同的随机数
- 生成一组指定范围内随机数(取50个数字,100到200的随机数字) LINQ方法
- C#生成指定数目的互不相同的随机数
- random()方法获得一定范围内的随机数
- 生成k个小于n的互不相同的随机数
- 算法--生成m个指定范围的不重复随机数的三种方法分析(Java实现)
- C++中生成任意范围内随机数的方法
- [算法][随机数]一种生成2个不相同的随机数的方法
- Shell中生成一定范围内随机整数几种方法
- 生成一定范围的不重复随机数
- SQL Server当中生成一定范围的随机数
- 生成 一定范围内的随机数
- 如何生成在一定范围内的double型的真正随机数?