變數定義:
- data:待亂序的陣列
- r:偽亂數生成器
- arr:亂序后的陣列
演算法代碼(C#):
T[] ShuffleCopy<T>(IEnumerable<T> data, Random r)
{
var arr = data.ToArray();
for (var i = arr.Length - 1; i > 0; --i)
{
int randomIndex = r.Next(i + 1);
T temp = arr[i];
arr[i] = arr[randomIndex];
arr[randomIndex] = temp;
}
return arr;
}
演算法原理:
Knuth-Durstenfeld Shuffle->每次從未處理的資料中隨機取出一個數字,然后把該數字放在陣列的尾部,即陣列尾部存放的是已經處理過的數字,
演算法步驟:
- 建立一個陣列大小為 n 的陣列 arr,分別存放 1 到 n 的數值;
- 生成一個從 0 到 n - 1 的亂數 x;
- 輸出 arr 下標為 x 的數值,即為第一個亂數;
- 將 arr 的尾元素和下標為 x 的元素互換;
- 同2,生成一個從 0 到 n - 2 的亂數 x;
- 輸出 arr 下標為 x 的數值,為第二個亂數;
- 將 arr 的倒數第二個元素和下標為 x 的元素互換;
- ……
- 如上,直到輸出 m 個數為止
相關文章:
.NET如何寫正確的“抽獎”——陣列亂序演算法——騰訊云
洗牌演算法(亂數生成)總結——博客園
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/79567.html
標籤:其他
上一篇:字符流中第一個不重復的字符
下一篇:《演算法導論》圖相關演算法小結
