用于生成某些形式的两个值(x,y)的一些向量的函数

时间:2012-06-19 11:49:10

标签: c++ python random distribution data-generation

编辑:我简单地重新提出这个问题: 如何在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

3 个答案:

答案 0 :(得分: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}));

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

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

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

依此类推......我不认为有一种适用于任何形状的“通用”解决方案。

答案 1 :(得分:1)

作为Luc Touraille的帖子的补充。

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

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

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

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

答案 2 :(得分:0)

你的问题没有明确说明。

没有“圆形分布”或“三角分布”这样的东西。

你可能意味着:一个圆形,矩形,三角形的均匀分布。 甚至没有唯一指定的三角形......

关键点是制服

E.g。 2D中的标准正态分布可能看起来有些圆形,但它并不完全是圆形。

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

E.g。在[0:1] x [0:1]上生成(x,y)对,并拒绝距离为.5,.5大于.5的那些 - 然后你得到圆圈。

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