0

编辑:我简单地重新表述了这个问题:如何在 C++ 或 Python 中生成随机点 (x,y) 以下:圆形分布、方形分布和三角形分布。

这是正方形的简单代码,例如:

def generateSquare(min, max, size):
    data = []

    for i in range(size):
        x = randint(min, max)
        y = randint(min, max)
        data += [[x, y]]

    return data
4

3 回答 3

2

首先,与其将坐标存储在向量中,不如使用std::pair自定义类:

struct Point
{
    int x;
    int y;
};

那么你只需要有一种生成随机点的方法,比如

Point randomPoint(Point const & min, Point const & max)
{
    static std::mt19937 gen;
    std::uniform_int_distribution<> distribX(min.x, max.x);
    std::uniform_int_distribution<> distribY(min.y, max.y);

    return Point{distribX(gen), distribY(gen)};
}

然后你可以使用这个生成函数来填充你的向量,例如generate_n

unsigned int const nbPoints = 100;

std::vector<Point> points;

std::generate_n(back_inserter(points), nbPoints, 
    std::bind(randomPoint, Point{0, 0}, Point{1000, 1000}));

请注意,这将生成随机点,因此不能保证最终得到正方形、三角形等。如果您想生成一个罐头,您可以使用非均匀分布(如果您知道坐标的分布跟随)生成您的数字,或使用拒绝抽样来丢弃不在您想要的区域内的点。

生成一个三角形归结为绘制三个随机点。

要生成一个正方形,您可以绘制两个点,对应于正方形的两个对角。

等等......我认为没有适用于任何形状的“通用”解决方案。

于 2012-06-19T12:08:16.493 回答
1

作为 Luc Touraille 帖子的补充。

对于一个正方形,找到两个随机点,让这两个点成为正方形的两个最远的角。

对于三角形,找到三个随机点,让三角形成为这三个点组成的三角形。

对于一个圆,找一个随机点作为圆心和另一个随机点,让两者之间的距离为圆的半径。

更通用的方法可能是找到图形的中心点,并通过进一步随机生成的数字来找到参数(比例、旋转等)。(我想有点像 Rook 建议的)。

于 2012-06-19T12:28:53.447 回答
0

您的问题未指定。

没有“圆形分布”或“三角形分布”之类的东西。

您可能的意思是:圆形、矩形、三角形形状的均匀分布。甚至没有唯一指定的三角形......

重点是统一

例如,二维中的标准正态分布可能看起来有点圆形,但它并不完全是圆形。

没有随机生成器直接产生一个密度均匀的圆;至少我不知道。最常见的方法就是生成一个正方形,并拒绝那些你不想拥有的点

例如,在 [0:1]x[0:1] 上生成 (x,y) 对,并拒绝距离 0.5,.5 大于 0.5 的那些 - 然后你就得到了圆。

如果您 - 正如其他用户所建议的那样 - 生成半径和距离,那么生成的点将不会均匀分布在圆上。

于 2012-06-19T18:03:57.720 回答