【问题标题】:How to generate Bad Random Numbers如何生成错误的随机数
【发布时间】:2011-05-05 03:59:27
【问题描述】:

我确信已经多次提出相反的问题,但我找不到任何关于如何生成错误随机数的答案。

我想写一个小程序进行聚类分析,想生成一些随机点进行测试。如果我只是插入 1000 个具有随机坐标的点,它们将分散在整个字段中,这将使聚类分析变得毫无价值。

有没有一种简单的方法来生成构建集群的随机数?

我已经考虑过要么不使用random(),而是使用random()*random(),它会生成正态分布的数字(我想我在 Stack Overflow 上的某个地方读到过这个)。

第二种方法是随机选择几个区域并在该区域再次运行点生成,这当然会在该区域产生一个集群。

你有更好的主意吗?

【问题讨论】:

标签: random cluster-analysis prng data-generation


【解决方案1】:

如果您有意生成结构良好的集群(而不是完全随机的集群),您可以将两者结合起来找到一个集群中心,然后在其周围放置很多点,使其呈正态分布。

以及在笛卡尔坐标 (x,y) 中工作;您可以使用径向方法来分配特定集群的点。选择一个随机角度(0-2PI 弧度),然后选择一个半径。 请注意,由于周长是成比例的半径,因此靠近中心的区域分布会更密集 - 但每个特定半径的分布将是相同的。修改径向分布以生成更紧密的集群。

或者,您可以将真实世界的派生数据用于具有自然聚类的半随机点分布。最近我一直在做很多地理空间聚类分析。为此,我使用了真实世界的数据——邮政编码质心(在城市周围形成自然集群);和餐厅的位置。另一个建议:您可以使用恒星目录或银河目录。

【讨论】:

    【解决方案2】:

    生成少量锚点。真正的随机数。然后在它们周围产生噪音:

    anchor + dist * (random() - 0.5))

    这将生成聚类数字,这些数字将均匀分布在距离dist

    【讨论】:

      【解决方案3】:
      • 为您的模型添加额外的维度。
      • 绘制不规则(即不平坦)表面。
      • 在扩展空间中生成数字。
      • 丢弃表面一侧的所有数字。
      • 从剩下的每个数字中删除附加维度。

      【讨论】:

        【解决方案4】:

        也许我误解了,但 gnu 科学库(用 c 编写)中有许多分布在其中 - 你不能从该库中选择高斯/泊松等坐标吗?

        http://www.gnu.org/software/gsl/manual/html_node/Random-Number-Distributions.html

        他们也提供了来自链接的泊松分布的简单示例。

        如果您需要您的分布有界(例如 y 坐标不小于 -1),那么您可以通过拒绝从 gsl 中的均匀分布中抽样来实现。

        祝福,汤姆

        【讨论】:

        • OP没有说明他使用的环境,GNU许可证可能不适合他的项目。
        【解决方案5】:

        我的第一个想法是,您可以使用linear congruential generator 实现自己的并试验系数,直到获得足够低的周期以满足您的需求。一个非常低的m 系数应该可以解决问题。

        我也喜欢你的第二个想法,即围绕几个预先选择的点运行一个好的 RNG 来创建集群。您可以使用此方法针对集群的特定区域,也可以随机生成这些区域。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-15
          • 1970-01-01
          • 1970-01-01
          • 2016-01-02
          • 1970-01-01
          • 2011-02-19
          • 2011-10-19
          • 1970-01-01
          相关资源
          最近更新 更多