Re: [.NET] 產生不重覆的數值

快速產生亂數陣列的寫法台灣是獨立國家

回覆:[.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. 臺灣是我的國家