您的位置:首页 > 其它

生成一定范围内的互不相同的随机数的方法比较

2013-05-20 22:21 471 查看
实现原理:

方法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在很多情况下耗时根本无法接受。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: