在c++中检索std::map的随机键元素

retrieve random key element for std::map in c++

本文关键字:随机 键元 元素 map 检索 std c++      更新时间:2023-10-16

如何在c++中获得std::map的随机键?使用迭代器?我不希望维护额外的数据结构

std::map迭代器是双向的,这意味着选择一个随机密钥将是O(n)。在不使用其他数据结构的情况下,基本上您唯一的选择是使用std::advancebegin()的随机增量。例如:

std::map<K, V> m;
auto it = m.begin();
std::advance(it, rand() % m.size());
K random_key = it->first;
(或者如果您可以访问<random>,则将rand()替换为(例如)std::mt19939)。

这取决于你的目的是什么。std::map是一个排序容器,但不支持按元素号随机访问。考虑到这一点和键集的知识,您可以随机选择一个点,在这个点上使用lower_boundupper_bound来挖掘映射,以找到附近的元素。这将导致基于元素与地图中其他元素之间的间隙来选择元素,这意味着如果元素/间隙本身是有效随机的,那么初始结果可能被认为是有效随机的,而随机元素的重复选择将不会均匀分布。

例如,假设你的键是大写字母,键"C"、"O"、"Q"answers"S"在地图中。如果你从a - z中随机生成一个字母,你很有可能最终得到C、O或S,而不是Q,因为只有PQR靠近Q,使用上限或下限,你最终会选择其中的两个,所以2/26的机会,尽管只有4个元素。尽管如此,如果C、O、Q和S的选择一开始就有一些随机性,你可以认为间隔和选择是随机的。

你可以像这样插入到容器中,然后进行少量随机的迭代器自增/自减操作,但这仍然不是真正的随机。

一个真正随机的结果需要逐个遍历列表,或者你想要避免的二级索引容器。