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}));

これによりランダムな点が生成されるため、最終的に正方形や三角形になるとは限らないことに注意してください。可能性を生成したい場合は、不均一な分布を使用することもできます (座標の分布がわかっている場合)。に従う) を使用して数値を生成するか、拒否サンプリングを使用して、必要な領域にないポイントを破棄します。

三角形を生成すると、3 つのランダムなポイントが描画されます。

正方形を生成するには、正方形の対角にある 2 つの角に対応する 2 つの点を描くことができます。

などなど...どのような形状でも機能する「普遍的な」ソリューションはないと思います。

于 2012-06-19T12:08:16.493 に答える
1

Luc Touraille の投稿の補足として。

正方形の場合、2 つのランダムな点を見つけ、これらの 2 つの点を正方形の最も離れた 2 つの角とします。

三角形の場合、3 つのランダムな点を見つけ、三角形をこれらの 3 つの点が作る三角形とします。

円の場合、円の中心となるランダムな点と別のランダムな点を見つけ、2 つの間の距離を円の半径とします。

より一般的なアプローチは、図の中心点を見つけ、さらにランダムに生成された数値によってパラメーター (スケール、回転など) を見つけることです。(Rookが示唆するように少し推測します)。

于 2012-06-19T12:28:53.447 に答える
0

あなたの問題は特定されていません。

「循環分布」や「三角分布」などというものはありません。

あなたはおそらく、円、長方形、三角形の形をした均一な分布を意味していました. 一意に指定された三角形さえありません...

ポイントは均一です。

たとえば、2D の標準正規分布はやや円形に見えるかもしれませんが、正確には円の形ではありません。

均一な密度の円を直接生成する乱数発生器はありません。少なくとも私が知っていることではありません。最も一般的な方法は、正方形を生成し、不要な点を拒否することです

たとえば、[0:1]x[0:1] で (x,y) ペアを生成し、.5,.5 からの距離が .5 より大きいものを拒否すると、円が得られます。

他のユーザーが提案したように、半径と距離を生成すると、生成されたポイントは円上に均一に分布しません。

于 2012-06-19T18:03:57.720 に答える