這是我必須在 Python 中解決的問題。
我必須創建一個加起來為 1 的亂數陣列。但是,有幾個條件需要考慮。
陣列中的元素數量是固定的。例如,讓我們考慮一個大小為 7 的串列。
這個陣列中有某些元素需要高于或低于某個數字。假設第二個元素需要高于 0.4,第三個元素需要小于 0.2,第七個元素需要低于 0.1。
在第 1 步和第 2 步之后,串列的總和應該是 1。
我不打算選擇滿足這些條件的結果,而是想為每個已經滿足條件的回圈創建通用陣列。
該腳本會告訴我串列應該有多長以及哪些元素需要高于或低于某些值。我可以使用的資訊是一個如下所示的陣列:
higher_than = 0.4
lower_than_1 = 0.2
lower_than_2 = 0.1
array = [1, 2, 0, 1, 1, 1, 0]
這里 2 表示結果權重應該高于“higher_than”。第一個 0 表示結果中的該元素應低于“lower_than_1”,第二個 0 表示結果中的該元素應低于“lower_than_2”。然后,我將使用此資訊為上述問題提出解決方案。
我非常想聽聽您對問題的見解和解決方案。先感謝您。
uj5u.com熱心網友回復:
有很多方法可以做到這一點。這是一個。
從你高于桶開始。如果您有 2 個以上,則沒有解決方案。否則為每個人分配地板(在您的示例中為 0.4)。
接下來,將每個桶視為有一個蓋子。給出了低于。對于higher_thans,使用比higher_than floor 少1.0(所以這里是0.6)。
記錄 rand() * 每個桶的上限。重新調整這些以等于初始分配到 high_than 存盤桶后剩余的容量,并完成分配。
例如,假設我們有兩個上限為 0.1 的桶,兩個上限為 0.2,一個下限為 0.4。
1. allocate weight to the higher_than bucket.
weights = [0.0, 0.0, 0.0, 0.0, 0.4] (buckets in order I listed them)
2. rand() * cap:
unscaled allocation = [0.73 * 0.1, 0.24 * 0.1, 0.34 * 0.2, 0.87 * 0.2, 0.33 * 0.6] = [0.073, 0.024, 0.068, 0.174, 0.198]
現在縮放有點棘手,因為幼稚的方法,按所需分配與當前分配的比率縮放所有內容,有超過低于上限的風險。
通過將縮放因子應用于大寫陣列來處理此問題 - 未縮放的分配。即 [0.1 - 0.073, 0.1 - 0.024, 0.2 - 0.068, 0.2 - 0.174, 0.6 - 0.198] = [0.027, 0.076, 0.132, 0.026, 0.402
我們想用它來縮放未縮放的分配陣列,使其總和為 0.6。目前它的總和為 0.537,caps_less_allocation 陣列的總和為 0.663。我們需要將我們的分配提高 0.6 - 0.537 = 0.063。所以我們將 caps_less_allocation 陣列中的所有內容乘以 0.063/0.663,然后將我們的三個陣列相加:
[0.0, 0.0, 0.0, 0.0, 0.4] - initial weight array
[0.073, 0.024, 0.068, 0.174, 0.198] - unscaled allocation array
[0.00257, 0.00722, 0.01254, 0.00247, 0.03820] - additive scaling factors (rounded)
---------------------------------------------------------------------
[0.07557, 0.03122, 0.08054, 0.17647, 0.63620]
現在我們有一個隨機陣列滿足我們的約束并且總和為 1.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/359128.html
