作者: Great Eagle
問題
小E最近在設計一款斗地主小游戲,為了保證發(fā)到玩家手中的牌具有隨機性,小E必須對現(xiàn)實世界中的洗牌過程進行模擬??此坪唵蔚囊粋€問題,卻難住了小E。
于是,小E向老師請教。
思路
點評:上面即為洗牌算法的思想,其本質是對數(shù)組元素進行隨機重排。數(shù)組中每個元素經(jīng)過洗牌算法后落在數(shù)組某個位置上的概率是相等的,洗牌算法在牌類游戲中非常有用。我們最終將算法的時間復雜度優(yōu)化到了O(n),空間復雜度優(yōu)化到了O(1)。
代碼實現(xiàn)
下面是作者用JavaScript實現(xiàn)的代碼,僅供參考?。ńㄗh大家自己動手實現(xiàn)一遍)
//對數(shù)組中的元素進行隨機重新排列,并返回
//arr:數(shù)組
function shuffle(arr) {
for(let i = arr.length - 1; i >= 0; i--) {
//隨機從0-i中選擇一個下標
let randomIndex = Math.floor(Math.random() * (i + 1));
//將選中的元素與arr[i]交換
let t = arr[randomIndex];
arr[randomIndex] = arr[i];
arr[i] = t;
}
//返回隨機重排后的數(shù)組
//隨機重排過程發(fā)生在原數(shù)組上,并未產(chǎn)生新數(shù)組
return arr;
}
溫馨提示:可左右滑動
復制代碼請前往https://blog.csdn.net/Great_Eagle/article/details/84839932