假设您有一个2D区域,并且您希望通过设置
在其中生成随机点x = random() * width
y = random() * height
这些点聚集在该区域的中心周围?我记得读过一些他们会说的话,但我不知道为什么,以及如何防止它。
答案 0 :(得分:4)
真正的随机点会产生聚类(或团块) - 这种效果可能会在绘制真实世界数据(如癌症病例)时引起混淆,并导致人们认为存在必须由某些事物引起的“热点”。
但是,在生成每次需要新数字时不创建新生成器的随机数时,您还需要小心 - 这将使用相同的种子值,这将导致所有值聚集在一个点上
答案 1 :(得分:4)
是。您拥有的点数越少,它们就越能形成集群。
为避免这种情况,您可以使用“分层抽样”。它基本上意味着你将表面均匀分布在较小的区域,并将你的点放在那里。
对于您的示例,您可以将n * n子方格中的平方除以。每个点都会随机放置在它的子方格内。您甚至可以调整随机因子,使模式或多或少随机/规则:
// I assume random() return a number in the range [0, 1).
float randomnessFactor = 0.5;
int n = 100;
for(int ySub=0; ySub<n; ++ySub){
for(int xSub=0; xSub<n; ++xSub){
float regularity = 0.5 * (1-randomnessFactor)
x = regularity + randomnessFactor * random() + xSub / (float) (n-1);
x = regularity + randomnessFactor * random() + xSub / (float) (n-1);
plot(x, y);
}
}
这样做的原因是你实际上并不想要随机性。 (团块是随机的。)你想要点均匀分布,但没有规则的模式。将点放在网格上并稍微抵消它们会隐藏规律性。
答案 2 :(得分:3)
这取决于随机数发生器的分布。假设分布完全均匀,则这些点可能以合理统一的方式分布。
另外,询问他们是否在中间聚集是假设你没有能力测试这个!
答案 3 :(得分:1)
根据我的经验,随机生成的点不会聚集在区域的中心,因为屏幕的每个像素都被选中的概率相同。
虽然使用random()生成的数字不是真正随机,但它们足以在屏幕上随机放置对象。
答案 4 :(得分:1)
如果随机数生成器的random()函数产生高斯分布,那么是。
答案 5 :(得分:1)
如果你使用极坐标而不是carthesian,你会在原点得到一个丛:
r = rand() * Radius;
phi = rand() * 2 * Pi;
原因是从统计上来说,圈r=[0,1]
将包含与圈r=[1,2]
一样多的点,即使戒指是三倍大。
答案 6 :(得分:1)
伪随机点不一定会聚集在一个区域的“中心”周围,但是它们将倾向于聚集在一个区域中的各个随机点上;事实上,这些团块经常比人们想象的更频繁地发生。通常使用所谓的 quasirandom 或low-discrepancy sequences来实现更均匀的空间分布,例如Sobol sequence,其维基百科文章显示的图形说明了Sobol和伪随机序列。
答案 7 :(得分:-1)
它们不会聚集,但会形成各种有趣的图案,分为2d或3d,具体取决于您使用的生成器。