星期三, 10月 21, 2009

(題目)取亂數不重複

今天在網路上逛阿逛..看到了一個題目【取亂數不重複】..感覺蠻有趣的..以我這沒學過演算法的人來說..一定會寫出鳥鳥沒效率的程式..所以直接找了一下goolge..原來有"洗牌演算法"這東西喔..哈..邏輯大概是這樣..

1.先準備好一個陣列a(n)..裡面就是你要取出的數字..
2.用亂數取出陣列的某值a(n)..然後再把最小的a(0)去補a(n)的位置..
3.然後在用亂數去從a(1)~a(n)去取值a(n)..然後再把最小的a(1)去補a(n)的位置..
4.同樣動作繼續下去..就可取出你想要的東西啦..

c#實作..

public class RandomCreator
{
public static int[] GetRandomNumber(int min, int max, int count)
{
if (max - min < 0)
throw new Exception("請輸入正確的範圍");

if ((max - min + 1) < count)
throw new Exception("請輸入想取得的正確數字");

Random r = new Random();
int[] tempArr = Enumerable.Range(min, max - min + 1).ToArray();
int[] resultArr = new int[count];
for (int i = 0; i < count; i++)
{
resultArr[i] = GetRandom(i, r, ref tempArr);
}
return resultArr;
}

private static int GetRandom(int start, Random r, ref int[] array)
{
int v = r.Next(start, array.Length);
int number = array[v];
array[v] = array[start];
return number;
}
}

測試一下..感覺還不錯..有空大家來討論一下吧..

參考:
http://social.msdn.microsoft.com/forums/zh-TW/236/thread/a239d85a-24cc-48a3-9196-00d99bb01e3e/

沒有留言: