生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。(要求使用两种方法)
解答:Random类是一个伪随机数算法,原理:
r(n)=(sed+r(n-1))%100;
class MyRand
{
private int seed;
private int prevNumber = 10;
public MyRand(int seed)
{
this.seed = seed;
}
public int Next()
{
int newRand = (seed + prevNumber) % 100;
prevNumber = newRand;
return newRand;
}
}
生成的随机数是依赖于上一个的,所以叫“随机数序列”。,确定的种子产生确定的随机数序列。
为了避免每次生成的随机数序列都一样,所以一般采用当前系统运行的毫秒数
Environment.TickCount做种子。
这就明白为什么
//for(int i = 0; i < 10; i++)
//{
// Random rand = new Random();
// Console.WriteLine(rand.Next(100));
//}
是错的。
经过反编译,Random类的无参构造函数最终也是调用有参的,传递的就是当前毫秒数
public Random() : this(Environment.TickCount)
这就验证了
//for(int i = 0; i < 10; i++)
//{
// Random rand = new Random();
// Console.WriteLine(rand.Next(100));
//}
为什么一样,或者一半一样,是因为在同一毫秒内。
做法1:
List<int> list = new List<int>();
Random rand = new Random();
while (list.Count < 100)
{
int number = rand.Next(1, 101);//>=1,<101
if (!list.Contains(number))//如果list中已经含有这个数,则不插入
{
list.Add(number);
}
}
foreach (int i in list)
{
Console.WriteLine(i);
}
做法2:
先把1-100这100个数按顺序放入数组arr,再重复100次下面的操作,生成两个介于 >=0,<100 之间的随机数m、n,颠倒arr[m]和arr[n]的数。
int[] arr = new int[100];
//把100个数顺序放入
for (int i = 0; i < 100; i++)
{
arr[i] = i + 1;
}
Random rand = new Random();
for (int i = 0; i < 100; i++)
{
//随机生成两个位置
int m = rand.Next(0, 100);
int n = rand.Next(0, 100);
//颠倒两个位置
int temp = arr[m];
arr[m] = arr[n];
arr[n] = temp;
}
效率比第一种高的多,这个只需要N次,而上一种至少需要N*N次
---------------------- ASP.Net+Unity开发、 .Net培训、期待与您交流! ----------------------详细请查看: www.itheima.com