私は単純な単純な「群衆」モデルを作成しようとしており、2D領域内にランダムな点を配置する必要があります。この半疑似コードは私の最善の試みですが、私はそれを実行する前に大きな問題を見ることができます。密集している人にとっては、新しいポイントが近すぎる可能性が非常に高くなり、非常に非効率的で、値が微調整されていないと失敗します。おそらく、署名付きの値についても問題はありますが、わかりやすくするために残しておきます。対象をグーグル後2Dのランダムな点の均等分布
int numPoints = 100;
int x[numPoints];
int y[numPoints];
int testX, testY;
tooCloseRadius = 20;
maxPointChecks = 100;
pointCheckCount = 0;
for (int newPoint = 0; newPoint < numPoints; newPoint++){
//Keep checking random points until one is found with no other points in close proximity, or maxPointChecks reached.
while (pointCheckCount < maxPointChecks){
tooClose = false;
// Make a new random point and check against all previous points
testX = random(1000);
testY = random(1000);
for (testPoint = 0; testPoint < newPoint; testPoint++){
if ((isTooClose (x[testPoint] , y[testPoint], textX, testY, tooCloseRadius)) {
tooClose = true;
break; // (exit for loop)
}
if (tooClose == false){
// Yay found a point with some space!
x[newPoint] = testX;
y[newPoint] = testY;
break; // (exit do loop)
}
//Too close to one of the points, start over.
pointCheckCount++;
}
if (tooClose){
// maxPointChecks reached without finding a point that has some space.
// FAILURE DEPARTMENT
} else {
// SUCCESS
}
}
// Simple Trig to check if a point lies within a circle.
(bool) isTooClose(centerX, centerY, testX, testY, testRadius){
return (testX - centreX)^2 + (testY - centreY)^2) < testRadius ^2
}
、私は私が何をやったかと考えているが棄却サンプリングと呼ばれている(?)、およびアダプティブ棄却サンプリングは、より良い方法かもしれないが、数学はあまりにも複雑です。
これを達成するための統計的な学位を必要としない優雅な方法はありますか?
uniform_randomについて説明できますか?これは0-> rangeの標準ランダム関数ですか? – Kez
@Kezはい。 [0、upper_bound]の範囲で値の一様確率を返します。ここで、upper_boundは最大の辺の長さです。 –
でも、x = uniform_random(0、rect_width)だけでなく、なぜ範囲を使うのか。等? – Kez