一个关于Random算法的问题
2015-11-12 18:54 只喝牛奶的杀手 阅读(1028) 评论(3) 编辑 收藏 举报指定范围数字,生成随机序列,数字不连续;例如:范围【1-5】 输入 1 3 5 2 4
下面分享两种算法:
算法1:RmNum<RmNext 下面这种算法计算是无压力的
/// <summary> /// 指定范围数字 生成随机序列 数字不连续 /// </summary> /// <param name="RmNum">随机序列个数</param> /// <param name="RmNext">范围</param> /// <returns></returns> public static Dictionary<int, int> GetRandomList(int RmNum, int RmNext) { Dictionary<int, int> dictionary = new Dictionary<int, int>(); Random rm = new Random(); for (int i = 0; dictionary.Count < RmNum; i++) { int nValue = rm.Next(1, RmNext); if (i == 0) { dictionary.Add(i, nValue); } if (!dictionary.ContainsValue(nValue)) { ArrayList arrayList = new ArrayList(); foreach (var item in dictionary) { arrayList.Add(item.Value); } if (dictionary.Count > 0) { if (Math.Abs(Convert.ToInt32(arrayList[arrayList.Count - 1]) - Convert.ToInt32(nValue)) > 1) { dictionary.Add(i, nValue); } } } } return dictionary; }
算法2:RmNum<RmNext 下面这种算法,如果RmNum和RmNext趋近的时候就会出现效率问题(甚至计算不出来)
/// <summary> /// 指定范围数字 生成随机序列 数字不连续 /// </summary> /// <param name="RmNum">随机序列个数</param> /// <param name="RmNext">范围</param> /// <returns></returns> public static List<int> GetRandomListNew(int RmNum, int RmNext) { int[] array = new int[RmNext]; List<int> List = new List<int>(); for (int i = 0; i <= array.Length - 1; i++) { array[i] = i + 1; if (i == 0) { List.Add(array[i]); } } for (int i = 0; List.Count < RmNum; i++) { if (!List.Contains(List[List.Count - 1])) { if (List.Count > 0) { if (Math.Abs(Convert.ToInt32(List[List.Count - 1]) - Convert.ToInt32(List[List.Count])) > 1) { List.Add(List[List.Count - 1]); } } } } return List; }
当RmNum=RmNext 时候,两种算法都会计算很长时间,甚至计算不出来,当时试着用hashtable,hashtable 可以存储但是是无序的,于是就用了Dictionary和list。
下面是调用的方法(直接粘过去是能用的):
Stopwatch sp = new Stopwatch(); sp.Start();//开始计时 foreach (var item in GetRandomList(9999, 10000)) { Console.WriteLine(string.Format("{0}", item.Value.ToString())); } sp.Stop(); Console.WriteLine(String.Format("耗时{0}", sp.ElapsedMilliseconds)); Console.Read();
指定范围数字,生成随机序列,数字不连续,我这个只是随机把一种组合打印出来,如果把所有组合都打印出来该怎么办???范围【1-5】 1 5 2 然后是不是就死循环了?
求大神解惑!!!
欢迎大家关注微信号killerhub,微信公众号名称:只喝牛奶的杀手, 扫下面的二维码或者收藏下面的二维码关注吧(长按下面的二维码图片、并选择识别图中的二维码)