回答
事情是這樣的:
int count = 0;
int index = -1;
for (int i = 0; i != n; ++i)
{
if (values[i])
{
++count;
if (unit_random <= 1.0f/count)
{
index = i;
}
}
}
因此,對於例如4個值,你得到他們的指標以下可能性:
1: (1/1) * (1/2) * (2/3) * (3/4) = 1/4
2: (1/2) * (2/3) * (3/4) = 1/4
3: (1/3) * (3/4) = 1/4
4: 1/4 = 1/4
編輯:正如史蒂夫·傑索普指出浮點比較最終會導致非常不一致的選擇。假設unit_random
被定義爲rand()/RAND_MAX
的對比可以改爲:
typedef unsigned long long u64;
u64 product = u64(count) * rand();
if (product <= u64(RAND_MAX))
這不會給完美的分佈因rand
離散性,但它會更好。
「隨機分佈」的含義並不十分清楚。這是否意味着「有一些未知的分佈」?如果是這樣,假設所有可能的分佈是同等可能的,所以「期望分佈」(如「期望值」)是均勻的(所有可能分佈的「平均值」)。然後,任何指數爲真,概率爲1/2。所以你的任務變成了儘可能快地遍歷數組的任務。從一開始就像通常迭代一個數組一樣,直到遇到一個TRUE值。
我的意思是沒有任何值的模式。他們不遵循任何分配功能。 – PaulV 2012-03-23 13:55:53
猜測這意味着[均勻分佈](http://en.wikipedia.org/wiki/Uniform_distribution_(discrete)),對不對? ;) – 2012-03-23 13:58:33
@PaulV:「隨機分佈」可能是一個糟糕的短語,如果你的意思是「他們沒有遵循任何分佈函數」。你可以說「任意布爾值」,或者只是「布爾值」。那麼你必須定義「最快」的含義,因爲如果你沒有這個值的分佈,那麼對於速度取決於這些值的任何算法,「預期的運行時間」是沒有的。 – 2012-03-23 14:47:53
爲了返回它,你必須首先計算True值(沒有辦法跳過那個)並且在另一個數組中累積它們的索引。計數後,您只需生成從0到N-1的隨機整數(其中N是True值的數目),然後從創建的數組中選取值。
僞蟒蛇:
indices=[]
for i,val in enumerate(arr):
if val:
indices.append(i)
randi = randint(0,len(indices)-1)
return indices[randi]
最快的解決辦法 - 假設你不要在同一陣列上反覆選擇 - 是選擇一個隨機指數,返回它,如果它是真的,並重復如果沒有。在最好的情況下,所有條目都是真的,這是O(1);在最壞的情況下,只有一個條目是真實的,這是O(n)(每次嘗試有1/n的機會擊中唯一的真實值,這意味着預期的n嘗試次數)。這並不比任何其他發佈的解決方案差。
但是,如果您希望數組通常幾乎都是錯誤的,您可能需要選擇另一個解決方案,因爲此隨機方法的運行時差異很大。
「這並不比其他任何解決方案都差」 - 複雜性並非如此,但它比安德烈亞斯的答案使用緩存效率低。而FWIW,安德烈亞斯的代碼捕捉失敗案例,而這種方法並沒有。也許「最好」的東西(交易期望與最壞的情況)是執行少量的隨機樣本,如果他們都沒有發現真實值,那麼就可以得出結論,數組很稀疏,並回退到安德烈亞斯的解決方案或類似的。 – 2012-03-23 14:39:32
簡單的解決方案:可以生成索引的置換(1:n)和在置換回報指數的順序如果相應值爲true
def randomTrue(x):
perm = randomPermute(0:len(x))
for i in perm:
if x[i]:
return i
- 1. 在lucene中索引布爾值的最佳選擇是什麼?
- 2. 在java中布爾值賦值的有效方法是什麼?
- 3. 優化隨機布爾值的方法
- 4. 返回一個隨機布爾值的最佳方法
- 5. 什麼是TRUE(240)布爾值
- 6. true是什麼區別?和布爾值
- 7. 選擇條件的隨機索引值
- 8. 爲什麼這個數組是2d數組布爾值true?
- 9. 當生成正態分佈的隨機值時,定義範圍的最有效方法是什麼?
- 10. 從布爾數組中返回一個索引值數組,其中true true
- 11. 爲什麼我讓一個空值賦給布爾值?解決這個問題的最好方法是什麼?
- 12. 從數組中選擇一個隨機值給出未定義
- 13. 什麼是mysql的最佳布爾值?
- 14. 獲得表達式布爾值的最佳方法是什麼?
- 15. C# - 根據一組布爾值生成字符串的最有效方法是什麼
- 16. jaxb將隨機字符串綁定到xs:布爾值'true'
- 17. 生成一個隨機布爾值70%True,30%false
- 18. 將布爾值傳遞給jQuery插件的最簡單方法是什麼?
- 19. 什麼是比較兩個布爾數組最有效的方法?
- 20. MySQL中檢索給定周內值的最有效方法?
- 21. 在Boost圖庫中給定頂點的鄰居的隨機選擇或隨機選擇的有效方法?
- 22. 從高斯分佈中抽取隨機值的最快方法是什麼?
- 23. scipy使用什麼方法從連續分佈中選擇隨機值?
- 24. 什麼是布爾值作爲返回值的方法?
- 25. 給定一個字符串數組什麼是隨機排序他們最簡單的方法是什麼?
- 26. Haskell如何確定隨機生成的數字是什麼樣的布爾值?
- 27. 獲取一組對象的兩個屬性的最小值和最大值的最有效方法是什麼
- 28. 布爾值Actionmailer True True
- 29. 選擇隨機值
- 30. 爲什麼布爾TRUE不是TRUE?
對不起,我忘了詞。我的意思是說:返回一個隨機TRUE值的索引...不僅僅是我們找到的第一個。但函數應隨機返回包含TRUE的任何一個索引。 – PaulV 2012-03-23 13:46:15
@PaulV這正是這個功能所做的。 – 2012-03-23 14:09:39
@尼克是啊,但我已經編輯了我的答案;) – 2012-03-23 14:17:05