我有以下问题:生成随机整数与差约束
产生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是不正确的。 –