You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何选择三次函数实现偏向区域中心的随机分布?

正确实现方案

问题根因

你当前的实现问题出在对x、y两个坐标轴单独做单向偏置:_r**3 会将[0,1]区间的随机数压缩到更小的靠近0的区间,映射到[-50,50]范围后所有点都会向最小值-50偏移,最终全部聚集在左下角区域,自然无法实现圆心处密集的效果。

正确实现思路

采用极坐标生成+极径偏置的方案,步骤如下:

  1. 生成[0, 1]区间的均匀随机数,对其做幂次变换得到偏置后的极径比例
  2. 乘以大圆半径得到实际极径长度
  3. 生成[0, 2π]区间的随机角度
  4. 将极坐标转换为直角坐标,得到小圆的相对圆心偏移量

实现代码

import random
import math
import pygame

# 偏置生成极坐标点,参数k控制偏置程度,k越大中心密度越高
def distBiasedCenter(big_radius, k=3):
    # 生成偏置极径:pow(random(), k) 越接近0概率越高
    # 系数1.2用于控制超出大圆的比例,设为1则所有点都在大圆内
    r = pow(random.uniform(0, 1), k) * big_radius * 1.2
    # 生成随机角度
    theta = random.uniform(0, 2 * math.pi)
    # 转直角坐标
    x = r * math.cos(theta)
    y = r * math.sin(theta)
    return (x, y)

# 测试代码
testBias = distBiasedCenter
rps = []
# 生成100个点,大圆半径50,偏置系数3
for i in range(100):
    rps.append(testBias(50, k=3))

# pygame绘制部分和你原有逻辑一致
pygame.init()
window = pygame.display.set_mode((600, 600))
while True:
    window.fill((0,0,0))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
    for p in rps:
         pygame.draw.circle(window, (255, 0, 0), (int(p[0] + 300), int(p[1] + 300)), 2)
    pygame.draw.circle(window, (0,255,0), (300, 300), 50, 1)
    pygame.display.flip()

参数调整说明

  • 调整k参数即可控制密度分布:
    • k=2时,小圆在范围内均匀分布
    • k>2时,中心密度高于边缘,k越大中心越密集
    • k<2时,边缘密度高于中心
  • 调整极径计算中的1.2系数即可控制点超出大圆的比例,系数越大超出的点越多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:24:03