根據The Art of Multiprocessor Programming , JavaConcurrentSkipListMap類包含一個randomLevel輸出以下內容的方法:
該
randomLevel()方法是基于經驗測量設計的,以保持跳過串列屬性。例如,在java.util.concurrent包中,對于最大 SkipList 級別 31,randomLevel()以概率 3/4 回傳 0,對于 i ∈ [1, 30],以概率 2^(?(i 2)) 回傳 0,以概率 2 回傳 31 ^-32。
這看起來像一個幾何分布,但不完全是。有什么方法可以根據提供的隨機分布巧妙地定義它,還是我必須自己進行操作,例如:
inline unsigned randomLevel() {
auto randNum = distribution.operator()(engine); // distribution is std::uniform_int_distribution<>
unsigned two__30{0x4000'0000};
if (randNum == 0)
return 31; // p(level == 31) = 2**-31
else if (randNum >= two__30)
return 0; // p(level = 0) = 0.75
else
return 30 - static_cast<unsigned>(log2(randNum)); // p(level = i) = 2**-(i 2)
}
uj5u.com熱心網友回復:
這看起來像一個幾何分布,但不完全是。
你是對的,但問題只是概率0。請注意,您可以std::geometric_distribution通過將前兩個值合并為一個來使用 ,。
class RandomLevel
{
std::geometric_distribution<unsigned> distribution;
std::mt19937 gen{std::random_device{}()};
public:
unsigned operator()() {
auto result = distribution(gen);
return result > 1u : result - 1u : 0u;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/437756.html
上一篇:C 模板lambda包裝器
下一篇:字串中最長的回文?
