1. 程式人生 > >C#實現在陣列中插入1-100的隨機數

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;由於我知道思想,自以為一會兒就寫出來的,說明知道和寫出來還是有差距的,平時還是要多寫程式的。希望能對大家有幫助。