You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

编写sample3d函数生成球面均匀分布的三维随机向量样本

嘿,我来帮你搞定这个三维球面均匀采样的函数实现~ 先提个小修正:原描述里的三维球面球心应该是三维坐标(1,1,1)(毕竟是三维空间嘛),接下来咱们一步步来实现它。

方法原理

这个采样方法的核心逻辑很清晰,利用单位立方体随机点归一化来得到球面均匀分布:

  • 先生成三个独立的**均匀分布Unif(-1,1)**随机变量X、Y、Z,得到单位立方体内的随机点
  • 将这个点除以它到原点的距离√(X²+Y²+Z²),就能把它映射到原点为球心的单位球面上,且分布均匀
  • 最后把归一化后的点平移到目标球心(1,1,1),就得到了我们需要的球面上的点

R语言实现

函数定义

sample3d <- function(n) {
  # 参数n:需要生成的样本数量
  # 生成n组Unif(-1,1)的独立随机变量
  x <- runif(n, min = -1, max = 1)
  y <- runif(n, min = -1, max = 1)
  z <- runif(n, min = -1, max = 1)
  
  # 计算每个点到原点的欧氏距离
  dist_to_origin <- sqrt(x^2 + y^2 + z^2)
  
  # 归一化到单位球面,再平移到目标球心(1,1,1)
  x_final <- 1 + x / dist_to_origin
  y_final <- 1 + y / dist_to_origin
  z_final <- 1 + z / dist_to_origin
  
  # 返回数据框格式的样本,方便后续处理
  return(data.frame(X = x_final, Y = y_final, Z = z_final))
}

调用示例

# 生成100个球面均匀分布的样本
sampl <- sample3d(100)

# 查看前5个样本的坐标
head(sampl)

Python语言实现

如果你用Python的话,也可以这样写:

函数定义

import numpy as np

def sample3d(n):
    # 参数n:需要生成的样本数量
    # 一次性生成n组三维随机点,每个分量服从Unif(-1,1)
    raw_points = np.random.uniform(low=-1, high=1, size=(n, 3))
    
    # 计算每个点的模长(到原点的距离)
    point_norms = np.linalg.norm(raw_points, axis=1, keepdims=True)
    
    # 归一化+平移到目标球心
    final_points = 1 + raw_points / point_norms
    
    return final_points

调用示例

# 生成100个样本
sampl = sample3d(100)

# 打印前5个样本
print(sampl[:5])

小提示

  • 这个方法几乎没有效率损耗,因为单位立方体完全包含单位球面,所有生成的点都能直接用,不需要丢弃
  • 一定要保证X、Y、Z是独立生成的,上面的代码里runifnp.random.uniform都满足这个要求
  • 如果原问题里的球心确实是二维坐标(1,1),那其实是二维圆的采样,方法类似:只需要生成X、Y两个变量,归一化后平移到(1,1)就行

内容的提问来源于stack exchange,提问作者Ellie Holden

火山引擎 最新活动