比方說,我有這樣的數組:慣用的方式來選擇陣列中的一個元素,這取決於元素的字段概率
[{name: "A", works: true}, {name: "B", works: true}, {name: "C", works: false}]
我想一個函數來選擇該陣列中的一個元素,讓我們說80%
獲得工作元素的可能性(works: true
)。
我怎麼能這樣做優雅?將欣賞任何語言的僞代碼或代碼。
(我可以用underscore.js
如果需要的話,如果用JS)
比方說,我有這樣的數組:慣用的方式來選擇陣列中的一個元素,這取決於元素的字段概率
[{name: "A", works: true}, {name: "B", works: true}, {name: "C", works: false}]
我想一個函數來選擇該陣列中的一個元素,讓我們說80%
獲得工作元素的可能性(works: true
)。
我怎麼能這樣做優雅?將欣賞任何語言的僞代碼或代碼。
(我可以用underscore.js
如果需要的話,如果用JS)
在你的情況首先你願意拋硬幣來決定,如果你要選擇一個工作元件或更低。這可以在JS中完成,Math.random()
返回[0,1]
中的值。
value = Math.random() <= 0.8
將設置值爲真80%的時間。在這一點上,你已經知道你想要哪種元素,所以你可以隨機選擇一個,並檢查是否有效。如果它是正確的類型返回它,否則選擇另一個隨機的一個。
如果您的列表很長,這可能需要很多選擇,在這種情況下,您可以拆分列表並保留兩個列表(工作列表和不工作列表)。
的功能:
function chooser(an_array) {
var node_found = false;
var works = Math.random() <= .80;
while(node_found === false) {
var node = an_array[Math.floor(Math.random()*an_array.length)];
if(node.works === works) node_found = true;
}
return node;
}
編輯:決定我應該對它進行測試。通過上述功能運行10000次,效果很好:http://jsfiddle.net/YyZfA/4/
你爲什麼這樣做[正如傑克](http://stackoverflow.com/a/13108897/548696)?有一個地方需要改變,特別是在'while(node_found === false)'部分(你可以在選擇隨機的元素之前過濾元素)。 – Tadeck
一般來說,如果兩個人提出了一個非常類似的解決方案,它意味着兩件事之一。要麼是正確的,要麼是到達的一個非常簡單的解決方案,但不一定是正確的。這一個既簡單又正確。不過,我想你可能暗示我以某種方式複製了傑克。我們幾乎在同一時間回答了這個問題,因爲在Stack Overflow通知我你的評論之前我還沒有看到他的解決方案。而且,這不是一個可以讓人們爲你工作的地方。提問者應該肯定會改進我的方法,如果他去了。這只是一個開始。 –
這是一個明智的評論,但僅解釋了您提交類似解決方案的原因。同意,這不是理想的,可以通過OP進行改進。無論如何,沒有理由刪除它 - 它有完整的代碼,這是在其他答案中沒有看到。 – Tadeck
看起來很不錯。這裏有一個實現(希望是正確的),以防萬一有興趣 - http://jsfiddle.net/XGGup/ – Dogbert
我認爲在某些情況下可能會出現一些問題。我認爲這種方法對解決方案的第一部分是有利的,第二部分應該是不同的。我的建議:1)選擇你選擇的選項(「是否有效」),通過檢查:Math.random()<= probability_for_works',2)如果結果爲true, 'works'屬性設置爲'true'的元素列表,否則從其餘元素中選擇隨機元素。這樣你就不會有隨機選擇然後丟棄的元素的選項。 – Tadeck
「_如果你的列表很長,這可能需要很多選擇,在這種情況下,你可以拆分列表並保留兩個列表(工作列表和非工作列表)_」。你所說的完全是我寫的,如果列表包含很多元素,避免重新選擇元素。 – Jack