演算法 洗牌問題 對隨機的深入理解

2021-10-08 14:29:52 字數 887 閱讀 4312

在刷leetcode的時候遇到這樣一道題:

打亂乙個沒有重複元素的陣列。

這道題其實不算難,略微一想其實能寫出很多解法。有一種洗牌演算法比較簡單的實現了o(n)的時間和空間複雜度。我自己最開始實現如下:

let

shuffle

=function()

return nums

};

思路很簡單:

使用洗牌演算法

先在0-n-1中,取隨機取乙個數,和首位0交換

然後在1-n-1中隨機取乙個數,和當前首位1交換

…思路就是每次確定乙個數,但是一定要機會平均。也就是說,在剩下的m個數取乙個的時候,每乙個的可能性要相等。

此時坑出現了。

最開始我使用這個方法,但很快我就發現不是絕對平均的。

math.round(math.random() * range + p)

想象一下在乙個有刻度的直尺(0-10)上隨機選乙個點,這個點完全隨機。然後四捨五入。取得數為1的概率,為1/10。即落在0.5到1.5之間都會是1。但是取得0或者10的概率,卻只有1/20。即只有0-0.5/9.5-10。

0-10之間只有10個寬度為1的區間,卻有11個數。

所以我們把這個尺子前後再增加0.5厘公尺。保證每乙個數被挑選出來的概率覺得相等,在離散的乙個個陣列下標來說,這才是真的隨機。

可能會產生疑惑的是,那-0.5 和 10.5這個刻度是不是會導致0和10的概率增加。答案是不會。我們研究的是區間概率,對於區間來說,無寬度的點是無窮小的。

let

shuffle

=function()

return nums

};

對this 的深入理解

this的取值,分四種情況。我們來挨個看一下。在此再強調一遍乙個非常重要的知識點 在函式中this到底取何值,是在函式真正被呼叫執行的時候確定的,函式定義的時候確定不了。因為this的取值是執行上下文環境的一部分,每次呼叫函式,都會產生乙個新的執行上下文環境。情況1 建構函式 所謂建構函式就是用來n...

隨機森林深入理解

決策樹演算法 id3 中,我們介紹了決策樹的分類思想及原理,可以看出,決策樹對經驗資料可以很好的分類,但是模型通用性不強,往往不準確,也就是過擬合。我們可以通過剪枝減弱過擬合,但是還不夠完美。隨機森林原理 隨機森林的出現,完美的解決了決策樹的劣勢,使得分類效果大大提公升,甚至超過了神經網路。隨機森林...

對正規化的深入理解

資料庫的設計正規化是資料庫設計所需要滿足的規範,滿足這些規範的資料庫是簡潔的 結構明晰的,同時,不會發生插入 insert 刪除 delete 和更新 update 操作異常。反之則是亂七八糟,不僅給資料庫的程式設計人員製造麻煩,而且面目可憎,可能儲存了大量不需要的冗餘資訊。正規化說明 1.1 第一...