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

---------------------- 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-100100个数按顺序放入数组arr,再重复100次下面的操作,生成两个介于 >=0,<100 之间的随机数mn,颠倒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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值