[C#] <C# 製作取出不重覆的數字陣列>



[C#] <C# 製作取出不重覆的數字陣列>

本帖最後由 Edwin 於 2010-10-1 00:25 編輯

時間過得好快呀~轉眼間又幾個月過去了QQ最近寫的程式,
常常過幾天就忘了。趁著記憶猶新,趕緊來做個學習筆記好
了。

這次寫的其中一段程式是,將22個數字,亂數排列,並將它
存到一個陣列中。程式的目的是為了,每當我按下重新洗牌
按鈕後,都能重新產生一個裡面元素是由 0到21所組成的陣
列(各個數字不能重覆哦)。

======實作程式碼區======

// 首先我先宣告兩個陣列
// 0到21總共有22個元素,所以宣告陣列大小為22

   
  int[] Num=new int[22];
  int[] RndArr=new int[22];

  Random rnd=new Random();
  int temp;

// 宣告亂數物件 rnd
// 宣告一個 temp 變數


   for(int k=0;k<=21;k++)
   {
       Num[k]=k;
    }

// 將 Num 陣列設值 就是依序為0到21
// 重點來了 下一段


   for(int j=0,x=22 ; j<=21 ; j++,x--)
  {
      temp=rnd.Next(x);
      RndArr[j]=Num[temp];
      Num[temp]=Num[x-1];
  }

=========解釋區===========

最後生出來的陣列 RndArr ,裡面就是不重覆的0到
21的亂數了。它的原理是一個跑22次的迴圈,每次
依照變數 j 的值當成索引,將 RndArr 由RndArr[0]
到 RndArr[21] 依序設值。

而 rnd.Next(x) 它會產生一個0到 x-1 的整數亂數,
每一次它產生的亂數值我將它設給 temp 存放。然後
利用 temp 當成 Num 陣列的索引,取出 Num[temp]
的值,再設給 RndArr 陣列。(注意哦! temp 是要給
Num 陣列的索引,不是要設給 RndArr 的值哦! )

接著再把 Num[temp] 的值由目前 Num 陣列的最後
一個元素的值來代替。而下個迴圈,依照 x 每次減 1的
特性,所以 rnd.Next(x) 產生的亂數它的上限就會每次
減一。因為 Num[temp]=Num[x-1] 的關係,就使得被
選中設到 RndArr 陣列中的數字在之後的迴圈都不會被選
到了,意思就好像 目前 Num 陣列裡索引為 temp 的值
被選到了,就把目前 Num 陣列裡,索引為 temp 的值,
由目前 Num 陣列裡最後一個元素的值來取代。也就是說一
但被選中了,那麼 Num 陣列裡就沒那個值啦。

沒想到短短幾行程式而已解釋要打這麼多字@@,我的目
的只是,難得我現在稍微有點想通了,希望別太快忘記。
所以做個筆記。

但還是希望對大家有用啦~~