我确信已经多次询问过相反的情况,但我找不到任何有关如何生成错误随机数的答案。
我想编写一个用于聚类分析的小程序,并希望生成一些随机点进行测试。如果我只是用随机坐标插入1000个点,它们将遍布整个场地,这将使得聚类分析毫无价值。
是否有一种简单的方法可以生成构建群集的随机数?
我已经考虑过要么不使用random()
而要使用生成正态分布数字的random()*random()
(我想我会在Stack Overflow上的某处读到这个)。
第二种方法是随机选取一些区域并在该区域再次运行点生成,这当然会在该区域产生一个簇。
你有更好的主意吗?
答案 0 :(得分:7)
如果您故意生成格式良好的集群(而不是完全随机的集群),您可以将两者结合起来找到集群中心,然后在正常分布中围绕它放置许多点。
以笛卡尔坐标(x,y)工作;您可以使用径向方法为特定群集分配点。选择随机角度(0-2PI弧度),然后选择半径。 请注意,由于圆周是比例半径,因此面积分布将更接近中心 - 但每个特定半径的分布将相同。修改径向分布以生成更紧密的群集。
或者您可以使用真实世界派生的数据进行具有自然聚类的半随机点分布。最近我一直在进行相当多的地理空间聚类分析。为此,我使用了现实世界的数据 - 邮政编码质心(在城市周围形成自然群集);和餐厅的位置。另一个建议是:你可以使用恒星目录或银河目录。
答案 1 :(得分:5)
生成一些锚点。真随机数。然后在它们周围产生噪音:
anchor + dist * (random() - 0.5))
这将生成聚类数字,这些数字将均匀分布在距离dist
。
答案 2 :(得分:2)
答案 3 :(得分:1)
也许我误解了,但是gnu科学图书馆(用c编写)里面写了很多分布 - 难道你不能从那个库中从高斯/泊松等中选取坐标吗?
http://www.gnu.org/software/gsl/manual/html_node/Random-Number-Distributions.html
它们也提供了一个简单的例子来说明链接中的泊松分布。
如果你需要限制你的分布(例如y坐标不小于-1),你可以通过gsl中均匀分布的拒绝采样来实现这一点。
祝福,汤姆
答案 4 :(得分:0)
我的第一个想法是,您可以使用linear congruential generator实现自己的功能,并尝试使用系数,直到您获得足够低的时间段以满足您的需求。一个非常低的m
系数应该可以解决问题。
我也喜欢你的第二个想法,围绕几个预先选定的点运行一个好的RNG来创建集群。您可以使用此方法定位群集的特定区域,也可以随机生成这些区域。