python - 在一个单位立方体中排列 N 个球体
问题描述
我想在一个单位立方体内排列 N 个硬球,使体积密度为 eta。我有一个代码,但效率不高。
def direct_disks_box(N, sigma):
condition = False
while condition == False:
L = [[random.uniform(sigma, 1.0 - sigma), random.uniform(sigma, 1.0 - sigma), random.uniform(sigma, 1.0 - sigma)]]
for k in range(1, N):
a = [random.uniform(sigma, 1.0 - sigma), random.uniform(sigma, 1.0 - sigma), random.uniform(sigma, 1.0 - sigma)]
min_dist = min(math.sqrt((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2 + (a[2] - b[2]) ** 2) for b in L)
if min_dist < 2.0 * sigma:
condition = False
break
else:
L.append(a)
condition = True
return L
如果你看上面的代码,拒绝率非常高。有什么办法可以降低拒签率?零拒绝率会很棒。太感谢了!
解决方案
如果我理解正确,当距离小于 sigma 的两倍时您会拒绝,并且您想减少拒绝的次数。但是您的“L”数组和您的“a”数组是使用相同的分布(均匀,在相同的限制之间)生成的,因此(不涉及数学)距离的概率分布函数(PDF)的平均值有点远离您的“两倍西格玛”阈值并且选择最小值无济于事。为了降低拒绝的几率,您可以确保使用稍微宽松的限制生成“a”数组。例如尝试以下操作:
threshold = -1.01 # changing "a" array distribution
a = [random.uniform(sigma*threshold, 1.0 - sigma*threshold), random.uniform(sigma*threshold, 1.0 - sigma*threshold),
random.uniform(sigma*threshold, 1.0 - sigma*threshold)]
推荐阅读
- powershell - 脚本调整包括域中的所有计算机
- python - 带有特殊字符“^”的文件名无法被 pattern.match 识别(RegEx 函数)
- php - 检测 SQL COUNT(*) 语句是否有新值
- angular - Angular 7 SSR - NgZone 的问题
- reporting-services - 用 SSRS 报告中其他表中的参考名称替换外键
- java - 使用来自自定义 Maven 插件的其他插件或依赖项
- .net - 是否可以使用 .NET 应用程序进行 Hazelcast 嵌入式部署
- mysql - 我怎样才能按两个日期中的最高值计算结果?
- java - ionic cordova build android - 守护进程构建错误,在哪里可以找到 APK?
- php - 问题:register_shutdown_function 没有启动