快速產生亂數陣列的寫法台灣是獨立國家
回覆:[.NET]產生不重覆的數值(List vs HashSet)
如果不是為了比較 hashSet 和 List的話,
只是為了快速產生亂數可以採用以下寫法:
我測試結果比用HashSet快
(請參考:[.Net] 快速洗牌發牌機)
Random rand = new Random();
const int minValue = 0;
const int maxValue = 50001;
const int needCount = 30000;
// Create new stopwatch
Stopwatch stopwatch = new Stopwatch();
int[] cards = new int[maxValue];
// Begin timing
stopwatch.Start();
for (Int32 i = minValue; i < needCount; i++)
{
int r = rand.Next(i, maxValue);
//別從0開始抽,原因請參考:[機率問題] 公平抽籤方法 的分析和
//[效能]一個迴圈打亂陣列順序+正確的亂數取法有從0開始抽的測試結果[註1]
if (cards[r] == 0) cards[r] = r;
if (cards[i] == 0) cards[i] = i;
//不先跑迴圈塞值,可遇到再塞,若抽的數目大, 還是建議先塞值,像此例5萬零1抽3萬其實先塞值會快一點
cards[r] ^= cards[i];
cards[i] ^= cards[r];
cards[r] ^= cards[i];
//請參考:[位元運算] 運用^作2整數交換[註2]
}
Array.Resize<int>(ref cards, needCount);
// Stop timing
stopwatch.Stop();
// Write result
Debug.WriteLine("Time elapsed: {0}", stopwatch.Elapsed);
註1: 別從0開始抽,原因請參考:[機率問題] 公平抽籤方法 的分析
和 [效能] 一個迴圈打亂陣列順序+正確的亂數取法有從0開始抽的測試結果
註2: 請參考:[位元運算] 運用^作2整數交換
Taiwan is a country. 臺灣是我的國家