您的位置:首页 > 职场人生

黑马程序员-传智播客资料中的面试题

2014-05-05 20:21 218 查看
----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
生一个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
的数。

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
;
                arr
 = temp;
            }


效率比第一种高的多,这个只需要N次,而上一种至少需要N*N次

----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: