如何随机选择最大化占用空间的样本点?

moj*_*iiz 7 c++ algorithm

我想生成可以随机填充/覆盖空间的样本点(如附图中所示).我认为他们有一种称为"准随机"的方法,可以生成这样的采样点.但是,这离我的知识有点远.有人可以提出建议或帮我找到可以这样做的图书馆吗?或者建议如何开始编写这样的程序?

采样点覆盖空间

在图像中,256个采样点应用于给定空间,放置在随机位置以覆盖整个给定空间.

更新:我只是尝试使用Halton准随机序列中的一些代码,并与下面的朋友发布的伪随机结果进行比较.在我看来,Halton方法的结果更好.我想分享一些结果如下;

伪随机和Halton序列

我写的代码是

#include "halton.hpp"
#include "opencv2/opencv.hpp"
int main()
{
    int m_dim_num = 2;
    int m_n = 50;
    int m_seed[2], m_leap[2], m_base[2];
    double m_r[100];
    for (int i = 0; i < m_dim_num; i++)
    {
        m_seed[i] = 0;
        m_leap[i] = 1;
        m_base[i] = 2+i;
    }

    cv::Mat out(100, 100, CV_8UC1);
    i4_to_halton_sequence( m_dim_num, m_n, 0, m_seed, m_leap, m_base, m_r);

    int displaced = 100;
    for (int i = 0; i < 100; i=i+2)
    {
        cv::circle(out, cv::Point2d((m_r[i])*displaced, (m_r[i+1])*displaced), 1, cv::Scalar(0, 255, 0), 1, 8, 0);
    }
    cv::imshow("test", out);
    cv::waitKey(0);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

由于我对OpenCV不太熟悉,我在OpenCV(Mat)矩阵上用绘图编写了这段代码."i4_to_halton_sequence()"是我上面提到的库中的函数.

结果并不是更好,但可能会以某种方式用于我的工作.有人有另一个想法吗?

tha*_*ang 6

我将给出一个似乎有点半的答案.但是,这个主题已在文献中进行了广泛的研究,因此我将向您介绍一些来自维基百科和其他地方的在线摘要.

您想要的也称为低差异序列(或准随机,正如您所指出的那样).您可以在这里阅读更多相关信息:http://en.wikipedia.org/wiki/Low-discrepancy_sequence.它对许多事物很有用,包括数值积分,最近,模拟视网膜神经节马赛克.

有许多方法可以生成低差异序列(或伪准随机序列:p).其中一些是ACM收集算法(http://www.netlib.org/toms/index.html).

我认为最常见的是Sobol序列(来自ACM的算法659).你可以在这里获得一些细节:http://en.wikipedia.org/wiki/Sobol_sequence

在大多数情况下,除非你真的投入其中,否则这些东西看起来非常可怕.为了快速获得结果,我将使用GNU的GSL(GNU科学库):http://www.gnu.org/software/gsl/

该库包括生成准随机序列的代码(http://www.gnu.org/software/gsl/manual/html_node/Quasi_002dRandom-Sequences.html),包括Sobol序列(http://www.gnu.org/software) /gsl/manual/html_node/Quasi_002drandom-number-generator-examples.html).

如果你仍然卡住了,我可以在这里粘贴一些代码,但你最好不要深入研究GSL.

  • GSL也是开源的.您可以直接从库中删除这些函数,而无需处理gcc或任何gnu内容:gsl_qrng_niederreiter_2,gsl_qrng_sobol,gsl_qrng_halton和gsl_qrng_reversehalton. (2认同)