我必须在特定网络中选择三个随机子网。网络本身总是有一个/24 子网掩码(我总是使用 10.10.127.0 进行测试)。这些随机子网可以有一个/25 子网掩码,一直到/29。现在最难破解的难题是子网的重叠。您在下面看到的代码可能看起来写得不好,但它可以完成工作。
但是,只有1个异常(exception):选择前两个非重叠子网,其中一个在10.10.127.0/25范围内,另一个在10.10.127.128/25范围内,我得到了一个无限的只要选择的第三个子网具有/25 子网掩码,就循环。这当然是有道理的,之前选择的两个子网都已经在两个/25 子网范围内。
我的问题是:我怎样才能解决这个问题并改进代码?如前所述,代码看起来写得不好,但是我不是一个好的程序员,我仍在尝试尽可能多地学习以提高我的技能。
import random
from netaddr import *
import itertools
def getRandomIP(networkIp=raw_input("Enter the desired network: ")):
chosenSubnets = []
network = networkIp + '/24'
ip = IPNetwork(network)
print ip
def subnetOverlap(randomSubnet1, randomSubnet2):
return (randomSubnet1.first <= randomSubnet2.last and
randomSubnet2.first <= randomSubnet1.last)
for randomNumber in random.sample(range(25, 30), 3):
subnetList = list(ip.subnet(randomNumber))
restartLoop = True
while restartLoop:
restartLoop = False
for subnet in random.sample(subnetList, 1):
chosenSubnets.append(subnet)
for pair in itertools.combinations(chosenSubnets , 2):
if subnetOverlap(IPNetwork(pair[0]),
IPNetwork(pair[1])) == True:
print 'OVERLAP'
chosenSubnets.pop()
restartLoop = True
print chosenSubnets
break
print subnet
getRandomIP()
最佳答案
我试图模仿我认为是您的初衷。具体来说,我
- 从 25 到 29 生成 3 个 不同 数字以生成 3 个子网列表,
- 从每个元素中选择一个元素,
- 检查这 3 个是否成对重叠。
- 如果是,我返回到 1。如果不是,我将它们退回。
具体来说,可以突出显示代码中的一些更改:
- subnetOverlap 从 getRandomIP 中分离出来
- 我只调用 subnetOverlap 中的对(我不确定你为什么需要在那里调用 IPNetwork,但这似乎是多余的)
- 我返回选择的子网,而不是打印它们,然后从函数调用中打印它们
- 我有一个默认的 networkIp,它是您测试的常用地址。如果你想要你的 raw_input 回来,改变评论。但我肯定会把 raw_input 放在函数的外部或内部,而不是作为您拥有它的默认变量。
希望对您有所帮助。
import random
from netaddr import *
import itertools
def subnetOverlap(randomSubnet1, randomSubnet2):
return (randomSubnet1.first <= randomSubnet2.last and
randomSubnet2.first <= randomSubnet1.last)
def getRandomIP(networkIp="10.10.127.240"):
network = networkIp + '/24'
ip = IPNetwork(network)
print ip
while 1:
chosenSubnets = []
overlap = False
#Choose 3 random subnetLists
for randomNumber in random.sample(range(25,30),3):
subnetList = list(ip.subnet(randomNumber))
#For each subnetList choose a subnet
chosenSubnets.append(random.sample(subnetList,1)[0])
#Check whether any pairs overlap
for pair in itertools.combinations(chosenSubnets,2):
if subnetOverlap(pair[0],pair[1]):
print "OVERLAP"
overlap = True
break
#No overlaps found
if overlap==True: continue
if overlap==False: break
#print chosenSubnets
return chosenSubnets
#networkIp = raw_input("Enter the desired network: ")
for i in range(20):
print "***************************"
print getRandomIP("10.10.127.240")
#getRandomIP(networkIp)
关于python - Python中如何根据特定范围选择三个随机的、不重叠的子网?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31637595/