加權隨機數適用於各種場景,其中某個範圍內的特定值被選擇的機率不同。在本文中,我們探索了兩種有效的方法來實現這一目標:
第一種方法由原始提問者提出,涉及拒絕採樣。此方法建立一個查找表,其中填入了範圍內的元素,其中每個元素出現的次數與其權重成正比。隨後,從查找表中選擇隨機索引來檢索隨機數。這裡的權衡在於建立查找表的線性時間複雜度和大權重規範的潛在記憶體消耗。
或者,迭代搜尋方法迭代計算權重總和同時遍歷重量規格。它將這個總和與隨機產生的 0 到 1 之間的數字進行比較。如果總和超過隨機數,則將相應的值作為隨機數傳回。與拒絕採樣不同,這種方法不會產生前期成本,但平均時間複雜度與權重規範中的條目數量成線性關係。
要在 JavaScript 中示範這兩種方法:
// Rejection Sampling function weightedRand(spec) { var i, j, table = []; for (i in spec) for (j = 0; j < spec[i] * 10; j++) table.push(i); return function() { return table[Math.floor(Math.random() * table.length)]; }; } var rand012 = weightedRand({0:0.8, 1:0.1, 2:0.1}); // Iterative Search function weightedRand2(spec) { var i, sum = 0, r = Math.random(); for (i in spec) { sum += spec[i]; if (r <= sum) return i; } }
方法的選擇取決於特定的應用程式需求,平衡時間複雜度、記憶體使用和確定性行為。拒絕採樣以預先表構建為代價提供恆定時間查找,而迭代搜索提供更簡單的實現和線性時間性能。透過利用這些技術,程式設計師可以有效地產生加權隨機數以滿足他們的各種程式需求。
以上是如何在程式設計中產生加權隨機數:拒絕採樣與迭代搜尋?的詳細內容。更多資訊請關注PHP中文網其他相關文章!