C#實現在陣列中插入1-100的隨機數
阿新 • • 發佈:2019-02-16
面試原題:實現填充1-100到一個容器為100的陣列中,不能重複,陣列只可以定義一個。
這是我上半年面試時遇到的一道題,當時第一次遇到就做出來,很有成就感,面試官現場給了我五分鐘 ,花了三分鐘想出來描述給他聽。不過前些時候學LinQ又遇到了一種方法,下午正好有空整理了下(國慶來臨,除了開會的別的基本都提前走了,辦公室就幾個人,也都不幹活了)。
方法一:
思想:先將陣列按順序從1到100填充,然後對下標進行隨機抽取互換。例如第一次在0-98中選一個隨機 數作為下標,將陣列這個下標的值跟下標為99的互換,於是第100數則為隨機數;第二次在0-97中選一個 隨機數作為下標,將陣列這個下標的值跟下標為98的互換,於是第99數則為隨機數,最後兩個位置的數 就都是隨機數;以此規律迴圈,直到最後所有的都是隨機數。程式碼如下:
思想:運用LinQ,首先生成1-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]為同一個變數時,導致另外兩個互換值的方法失效如下:
當下標一樣時,array[N - j]和array[randomIndex]為同一個變數,第一行為0,同時array[N - j]值本身都變成了0,所以只要相等時,互換變數就都變成了0;另一種也差不多,如下://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];
看第二行,如果兩個是同一個變數,值相減就會變為0,第三行就是0-0還是0;由於我知道思想,自以為一會兒就寫出來的,說明知道和寫出來還是有差距的,平時還是要多寫程式的。希望能對大家有幫助。