我想编写一个代码,用于检测表面上100个随机圆的碰撞,范围为-15 <= x,y <= 15。代码运行良好,但有一个问题恰好是重复的反向答案,例如程序给我的结果如:
disc 1 with disc 85
disc 8 with disc 35
...................
disc 35 with disc 8
...................
disc 85 with disc 1
...................
因此它只会显示1和85而不会反转85和1。 我正在试图找出如何删除它们,因为我需要它来代码的下一部分。
import math
lista=[[],[],[]]
import random
for i in range(0,100):
lista[0].append(random.uniform(-14.5,14.5))
lista[1].append(random.uniform(-14.5,14.5))
lista[2].append(0.5)
def kol(a):
for i in range(0,100):
q1=lista[0][i]
w1=lista[1][i]
for k in range(0,100):
if k==i:
continue
q2=lista[0][k]
w2=lista[1][k]
if math.sqrt((abs(q1-q2))**2+(abs(w1-w2))**2)<1:
print('Kolizja dysków: ',i+1,'z',k+1)
print(kol(1))
答案 0 :(得分:1)
你的循环检查距离两次,因为你只排除了相同的索引,而不是上三角或下三角,这解释了重复。
我按原样改写:
for i in range(0,100):
q1=lista[0][i]
w1=lista[1][i]
for k in range(i+1,100): # only above i
q2=lista[0][k]
w2=lista[1][k]
if ((abs(q1-q2))**2+(abs(w1-w2))**2)<1:
print('Kolizja dysków: ',i+1,'z',k+1)
除此之外,不要测试平方根,因为平方值&lt; 1相当于值&lt; 1,所以节省一些计算能力。
答案 1 :(得分:1)
而不是
for k in range(0,100):
使用
for k in range(i + 1, 100):
因此k
始终大于i
。