如何选择三次函数实现偏向区域中心的随机分布?
正确实现方案
问题根因
你当前的实现问题出在对x、y两个坐标轴单独做单向偏置:_r**3 会将[0,1]区间的随机数压缩到更小的靠近0的区间,映射到[-50,50]范围后所有点都会向最小值-50偏移,最终全部聚集在左下角区域,自然无法实现圆心处密集的效果。
正确实现思路
采用极坐标生成+极径偏置的方案,步骤如下:
- 生成[0, 1]区间的均匀随机数,对其做幂次变换得到偏置后的极径比例
- 乘以大圆半径得到实际极径长度
- 生成[0, 2π]区间的随机角度
- 将极坐标转换为直角坐标,得到小圆的相对圆心偏移量
实现代码
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
相关产品推荐
相关产品推荐

