C#实现在数组中插入1-100的随机数

        面试原题:实现填充1-100到一个容器为100的数组中,不能重复,数组只可以定义一个。
        这是我上半年面试时遇到的一道题,当时第一次遇到就做出来,很有成就感,面试官现场给了我五分钟 ,花了三分钟想出来描述给他听。不过前些时候学LinQ又遇到了一种方法,下午正好有空整理了下(国庆来临,除了开会的别的基本都提前走了,办公室就几个人,也都不干活了)。
        方法一:
        思想:先将数组按顺序从1到100填充,然后对下标进行随机抽取互换。例如第一次在0-98中选一个随机 数作为下标,将数组这个下标的值跟下标为99的互换,于是第100数则为随机数;第二次在0-97中选一个 随机数作为下标,将数组这个下标的值跟下标为98的互换,于是第99数则为随机数,最后两个位置的数 就都是随机数;以此规律循环,直到最后所有的都是随机数。代码如下:

const int N = 100;
int[] array = new int[N];
for (int i = 0; i < N; i++)
{
    array[i] = i + 1;
}
for (int j = 1; j < N; j++)
{
    int randomIndex = new Random(j * array[N - j]).Next(0, N - j);
    //first method
    int temp = array[N - j];
    array[N - j] = array[randomIndex];
    array[randomIndex] = temp;
    //second method
    //array[N - j] = array[N - j] ^ array[randomIndex];
    //array[randomIndex] = array[N - j] ^ array[randomIndex];
    //array[N - j] = array[N - j] ^ array[randomIndex];
    //third method
    //array[N - j] = array[N - j] + array[randomIndex];
    //array[randomIndex] = array[N - j] - array[randomIndex];
    //array[N - j] = array[N - j] - array[randomIndex];
}
        方法二:
        思想:运用LinQ,首先生成1-100的整数序列,然后根据随机数排序;
        代码只有两句,如下:

int[] array = new int[N];
array = Enumerable.Range(1, N)
            .OrderBy(n => (new Random(n).Next()))
            .ToArray<int>();
        方法一附带了两种不需要第三个变量互换值的方法,在写例子时由于边界没考虑全面,当array[N - j]和array[randomIndex]为同一个变量时,导致另外两个互换值的方法失效如下:

//second method
//array[N - j] = array[N - j] ^ array[randomIndex];
//array[randomIndex] = array[N - j] ^ array[randomIndex];
//array[N - j] = array[N - j] ^ array[randomIndex];
        当下标一样时,array[N - j]和array[randomIndex]为同一个变量,第一行为0,同时array[N - j]值本身都变成了0,所以只要相等时,互换变量就都变成了0;另一种也差不多,如下:
//third method
//array[N - j] = array[N - j] + array[randomIndex];
//array[randomIndex] = array[N - j] - array[randomIndex];
//array[N - j] = array[N - j] - array[randomIndex];
        看第二行,如果两个是同一个变量,值相减就会变为0,第三行就是0-0还是0;由于我知道思想,自以为一会儿就写出来的,说明知道和写出来还是有差距的,平时还是要多写程序的。希望能对大家有帮助。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值