Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何随机选择最大化空间占用的采样点?_C++_Algorithm - Fatal编程技术网

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

C++ 如何随机选择最大化空间占用的采样点?,c++,algorithm,C++,Algorithm,我想生成可以随机填充/覆盖空间的采样点(如附件中的图像)。我认为他们有一种称为“准随机”的方法,可以生成这样的样本点。然而,这与我的知识相去甚远。有人能提出建议或帮助我找到一个可以这样做的图书馆吗?或者建议如何开始编写这样的程序 在图像中,256个采样点应用于给定空间,放置在随机位置以覆盖整个给定空间 更新: 我只是尝试使用一些来自的代码,并与下面朋友发布的伪随机结果进行比较。我认为霍尔顿方法的结果更好。我想分享一些结果如下 我写的代码是 #包括“halton.hpp” #包括“openc

我想生成可以随机填充/覆盖空间的采样点(如附件中的图像)。我认为他们有一种称为“准随机”的方法,可以生成这样的样本点。然而,这与我的知识相去甚远。有人能提出建议或帮助我找到一个可以这样做的图书馆吗?或者建议如何开始编写这样的程序

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

更新: 我只是尝试使用一些来自的代码,并与下面朋友发布的伪随机结果进行比较。我认为霍尔顿方法的结果更好。我想分享一些结果如下

我写的代码是

#包括“halton.hpp”
#包括“opencv2/opencv.hpp”
int main()
{
int m_dim_num=2;
int m_n=50;
int m_seed[2],m_leap[2],m_base[2];
双m_r[100];
对于(int i=0;i

由于我对OpenCV有点熟悉,我在OpenCV(Mat)的矩阵上通过绘图编写了这段代码。“i4_to_halton_sequence()”是我上面提到的库中的函数

结果不是更好,但可能对我的工作有所帮助。有人有其他想法吗?

您只需要库rand()函数:

#include <stdlib.h>
#include <time.h>

unsigned int N = 256; //number of points
int RANGE_X = 100; //x range to put sample points in
int RANGE_Y = 100;

void PutSamplePoint(int x, int y)
{
   //some your code putting sample point on field
}

int main()
{
    srand((unsigned)time(0)); //initialize random generator - uses current time as seed
    for(unsigned int i = 0; i < N; i++)
    {
        int x = rand() % RANGE_X; //returns random value in range [0, RANGE_X)
        int y = rand() % RANGE_Y;
        PutSamplePoint(x, y);
    }

    return 0;
}
#包括
#包括
无符号整数N=256//点数
整数范围_X=100//用于放置采样点的x范围
int范围_Y=100;
无效采样点(整数x,整数y)
{
//有些代码将示例点放在字段上
}
int main()
{
srand((无符号)时间(0));//初始化随机生成器-使用当前时间作为种子
for(无符号整数i=0;i
您可以创建等距点(所有点与相邻点的距离相同),然后在第二步中,将每个点随机移动一点,使其看起来“随机”

我的第二个想法是:
1.从一个区域开始。
2.在你所在区域的“中间”创建一个随机点P标记。
3.用该点将该区域划分为4个区域。P是左下分区的右上角,右下分区的左上角,依此类推。
4.对所有4个子区域重复步骤2..4。当然,不是永远,而是直到您满意为止

该算法确保每个“孔”(即新的子区域)都填充有一个点


更新:由于第(2)步的原因,您的初始面积应该是您的面积的两倍。这可以确保在边缘和拐角处也有点。

好的,这里有另一种覆盖整个空间的准随机方法

由于要使用256个点,因此可以先将这些点绘制为16x16网格

然后应用一些函数,为每个点提供一些随机偏移(例如,点的x和y坐标为0到±2)。

这称为a。链接的Wiki页面解释了如何生成它们


但是我怀疑你已经知道了这一点,因为你的形象与维基百科中的非常相似,我将给出一个似乎半途而废的答案。然而,这个话题在文献中已经被广泛研究过,所以我只会让你参考维基百科和其他在线地方的一些摘要

你所需要的也被称为低差异序列(或你所指出的准随机序列)。你可以在这里阅读更多关于它的内容:。它对许多事情都很有用,包括数值积分,以及最近的模拟视网膜神经节镶嵌

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

我认为最常见的一种称为Sobol序列(ACM的659算法)。您可以在这里获得一些详细信息:

在大多数情况下,除非你真的对它感兴趣,否则这些东西看起来相当可怕。为了快速获得结果,我会使用GNU的GSL(GNU科学图书馆):

该库包含生成准随机序列的代码(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。

@acheong87感谢你改进了我的语法。你的示例图像非常对称-这是你需要的解决方案吗?你的示例正是Sobol序列。你从维基百科获得了它吗?@thang我从其他来源获得了这张图片,howe再次浏览维基百科的网站链接:p@JasonD我只需要点是随机的,任意覆盖空间的所有区域。该图像只是一个示例,便于解释。@FominArseniy,感谢您的代码。但是,通过您提供的方法,点似乎没有覆盖整个块(100x100)。这些点是随机的,但在区块的某些区域仍然是空的。这完全是错误的。这个问题要求的是与普通伪随机点完全不同的东西。为@FominArseniy辩护,实际上并不立即清楚提问者的意思。还请记住,FominArseniy在
#include <stdlib.h>
#include <time.h>

unsigned int N = 256; //number of points
int RANGE_X = 100; //x range to put sample points in
int RANGE_Y = 100;

void PutSamplePoint(int x, int y)
{
   //some your code putting sample point on field
}

int main()
{
    srand((unsigned)time(0)); //initialize random generator - uses current time as seed
    for(unsigned int i = 0; i < N; i++)
    {
        int x = rand() % RANGE_X; //returns random value in range [0, RANGE_X)
        int y = rand() % RANGE_Y;
        PutSamplePoint(x, y);
    }

    return 0;
}