我有以下問題:生成隨機整數與差約束
產生m個由範圍爲0-N,其中N >> M,且其中沒有對具有差小於K.
均勻隨機整數其中M >> K
。
目前我能想到的最好的方法是維護一個排序列表,然後確定當前生成的整數的下界,並用下方和上方元素進行測試,如果可以插入元素之間。這是複雜的O(nlogn)。
會碰巧有更高效的算法嗎?
的問題的一個例子:
生成零和1億,其中任何兩個整數之間的差不小於1000
全面的方式來解決,這將是到1000個之間的均勻隨機整數:
- 確定的正選擇-M滿足約束的所有組合,讓稱爲它設置X
- 在範圍[0,選擇均勻隨機整數i,| X |)。
- 從X中選擇第i個組合作爲結果。
當n選擇m很大時,此解決方案有問題,因爲枚舉和存儲所有可能的組合將會非常昂貴。因此尋求高效的在線生成解決方案。
注:下面是一個C++實現由提供的解決方案的十五邊形
std::vector<int> generate_random(const int n, const int m, const int k)
{
if ((n < m) || (m < k))
return std::vector<int>();
std::random_device source;
std::mt19937 generator(source());
std::uniform_int_distribution<> distribution(0, n - (m - 1) * k);
std::vector<int> result_list;
result_list.reserve(m);
for (int i = 0; i < m; ++i)
{
result_list.push_back(distribution(generator));
}
std::sort(std::begin(result_list),std::end(result_list));
for (int i = 0; i < m; ++i)
{
result_list[i] += (i * k);
}
return result_list;
}
。
應該如何分配?有一定數量的可能結果。如果所有這些都有相同的概率? –
@Heuster:'分配應該如何?'均勻分佈。 –
我不認爲你的例子是有效的,因爲1000 >> 1000是不正確的。 –