问题描述:产生一个长度为100的数组,为数组中的每一项随机填充1-100之间的数并且保证不重复 (C#实现)
class Program
{
static void Main(string[] args)
{
GetValue(100);
GetValue(1000);
GetValue(10000);
GetValue(100000);
Console.ReadLine();
}
private static void GetValue(int count)
{
Console.WriteLine("产生{0}个随机数", count);
var stw1 = new Stopwatch();
stw1.Start();
Rand1(count);
stw1.Stop();
Console.WriteLine("方法一耗时:{0}({1}毫秒)", stw1.Elapsed, stw1.ElapsedMilliseconds);
var stw2 = new Stopwatch();
stw2.Start();
Rand2(count);
stw2.Stop();
Console.WriteLine("方法二耗时:{0}({1}毫秒)", stw2.Elapsed, stw2.ElapsedMilliseconds);
Console.WriteLine();
}
/// <summary>
/// 方法一
/// </summary>
static void Rand1(int count)
{
var lst = new List<int>(count);
for (var i = 0; i < count; i++)
{
lst.Add(i + 1);
}
var num = new int[count];
var rd = new Random();
for (var i = 0; i < count; i++)
{
var n = rd.Next(0, lst.Count);
num[i] = lst[n];
lst.RemoveAt(n);
}
}
/// <summary>
/// 方法二
/// </summary>
private static void Rand2(int count)
{
var lst = new List<int>(count);
var rd = new Random();
do
{
var n = rd.Next(1, count + 1);
if (!lst.Contains(n)) lst.Add(n);
} while (lst.Count < count);
}
}
输出结果:
产生100个随机数
方法一耗时:00:00:00.0002995(0毫秒)
方法二耗时:00:00:00.0002533(0毫秒)
产生1000个随机数
方法一耗时:00:00:00.0001203(0毫秒)
方法二耗时:00:00:00.0109224(10毫秒)
产生10000个随机数
方法一耗时:00:00:00.0031532(3毫秒)
方法二耗时:00:00:01.1962977(1196毫秒)
产生100000个随机数
方法一耗时:00:00:00.3800280(380毫秒)
方法二耗时:00:02:46.7962774(166796毫秒)
->可以看出数量大的时候,第二种方式的效率就非常低了