来自2维网格的不同随机点

时间:2012-05-25 12:24:52

标签: c++ random

我有一个大的二维网格,让我们说10000 X 10000.从这些网格我需要选择1000个随机点,但我还需要注意这两个点都不相同。我想到的标准方法是在选择每个点之后,我应该检查所有先前的条目,看看是否已经选择了该点,但是对于大网格和大量点来说,这似乎效率低下。有没有更好的方法呢? 我正在使用C ++

3 个答案:

答案 0 :(得分:3)

  

似乎对于大网格和大量积分这将变得效率低下

不一定。有两种潜在的低效率来源:

  1. 拒绝采样导致的开销(也就是说,必须继续尝试,直到找到尚未选择的点)。鉴于你选择了0.001%的分数,两次随机选择同一分数的几率非常小。因此,重新尝试的成本应该可以忽略不计。
  2. 检查是否已选择随机选择的点的开销。如果将所有先前选定的点存储在合适的数据结构中,则可以在O(1)时间内完成。为此,std::unordered_set将是一个很好的候选人。集合的大小将以您需要选择的元素数量线性增长,并且将完全独立于网格大小。

答案 1 :(得分:1)

你可以实现这样的算法:

  
      
  1. 创建从哈希到点的空映射
  2.   
  3. 选择随机点
  4.   
  5. 计算哈希
  6.   
  7. 如果是映射哈希,请转到1
  8.   
  9. save hash&点
  10.   
  11. 如果还不够,请转到1
  12.   

答案 2 :(得分:0)

随机选择任何一个点,如果它存在于选定点列表中,则丢弃它不应该是低效的,只要你有明确排序的选择点的集合,您也可以轻松插入。

此外,根据您的点的定义方式(即它们各自与您定义的类或结构相关联),您可以向点对象添加一个名为Selected的布尔变量。选择一个点后,请检查它是否已标记为Selected。如果没有,请将其添加到您的列表中,并将Selected值更改为TRUE。否则,继续选择随机点。