gpt4 book ai didi

random - 二维随机点的均匀分布

转载 作者:行者123 更新时间:2023-12-02 00:45:42 25 4
gpt4 key购买 nike

我正在尝试做一个简单的“人群”模型,需要在 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
}

在谷歌上搜索该主题后,我相信我所做的称为拒绝采样(?),自适应拒绝采样可能是更好的方法,但数学太复杂了。

有没有不需要统计学学位就能实现这一点的优雅方法?

最佳答案

对于您提出的问题,生成随机样本的最佳方法是使用泊松盘采样。

https://www.jasondavies.com/poisson-disc

现在,如果您想以简单的方式对矩形中的随机点进行采样。简单地从 0 到最大尺寸的长度,每个点采样两个值。

如果表示较小维度的值大于该维度,则丢弃该对并重试。

伪代码:

while (need more points)
begin
range = max (rect_width, rect_height);

x = uniform_random(0,range);
y = uniform_random(0,range);

if (x > rect_width) or (y > rect_height)
continue;
else
insert point(x,y) into point_list;
end

对两个长度中较大的一个进行采样的原因是为了在长度不同时使统一选择标准等效。

例如,假设一侧的长度为 K,另一侧的长度为 10K。假设使用的数字类型的分辨率为 K 的 1/1000,则对于较短的边,只有 1000 个可能的值,而对于较长的边,则有 10000 个可能的值可供选择。 1/1000 的概率与 1/10000 不同。简单地说,短边的坐标值出现的概率比长边的坐标值大 10 倍 - 这意味着采样并不真正均匀。


用于确保生成的点与任何已生成的点的距离不小于某个距离的场景的伪代码:

while (need more points)
begin
range = max (rect_width, rect_height)

x = uniform_random(0,range);
y = uniform_random(0,range);

if (x > rect_width) or (y > rect_height)
continue;

new_point = point(x,y);

too_close = false;

for (p : all points)
begin
if (distance(p, new_point) < minimum_distance)
begin
too_close = true;
break;
end
end

if (too_close)
continue;

insert point(x,y) into point_list;
end

关于random - 二维随机点的均匀分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42603609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com