星期二, 10月 12, 2010

(題目)取亂數不重複 2

之前發過一篇文章"(題目)取亂數不重複",這篇文章用了洗牌演算法來做這個需求,這個 method 效率跟功能都很不錯,也時常在專案中使用到,今天在處理相同的問題時,順手問一下同事,也查一下網路的資料,發現有一種寫法也很不錯,這裡也來紀錄一下,直接看 code 吧!!

public class RandomCreator
{
/// <summary>
/// 取出亂數不重複的array
/// </summary>
/// <param name="min">最大值</param>
/// <param name="max">最小值</param>
/// <param name="count">取出的筆數</param>
/// <returns></returns>
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("請輸入想取得的正確數字");

int rang = max - min + 1;
return Enumerable.Range(min, rang)
.OrderBy(a => Guid.NewGuid())
.Take(count)
.ToArray();
}
}

上面的方法,就是把範圍取出來,然後用guid去標記之後再排序,因為guid每次都不同,所以就亂數啦,這方法很像我們 MS-SQL 裡面取亂數的方法,很簡單又很直覺,分享一下..^^..

參考:

2 則留言:

匿名 提到...

感覺限制 count 的大小很奇怪,就算取範圍 1 ~ 5 但需要取得 10 個數值應該也合理吧。

Bibby 提到...

範圍1~5您取10筆資料出來,那一定會重複,結果會跟我們想達到的目的有所違背,所以不合理