如何在Python中根据特定范围选择三个随机的、不重叠的子网?

如何在Python中根据特定范围选择三个随机的、不重叠的子网?,python,Python,我必须在特定网络中随机选择三个子网。网络本身将始终具有/24子网掩码(出于测试目的,我始终使用10.10.127.0)。这些随机子网可以有/25子网掩码,一直到/29。现在最难解决的问题是子网的重叠。下面看到的代码可能写得不好,但它确实做到了 但是,只有一个例外:当选择前两个不重叠的子网时,其中一个在10.10.127.0/25范围内,另一个在10.10.127.128/25范围内,每当选择的第三个子网具有/25子网掩码时,我就会得到一个无限循环。当然,这是有道理的,之前选择的两个子网都已在/2

我必须在特定网络中随机选择三个子网。网络本身将始终具有/24子网掩码(出于测试目的,我始终使用10.10.127.0)。这些随机子网可以有/25子网掩码,一直到/29。现在最难解决的问题是子网的重叠。下面看到的代码可能写得不好,但它确实做到了

但是,只有一个例外:当选择前两个不重叠的子网时,其中一个在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()
随机导入
从NetAddress导入*
进口itertools
def getRandomIP(网络IP=原始输入(“输入所需网络:”):
chosenSubnets=[]
网络=网络IP+'/24'
ip=ip网络(网络)
打印ip
def子网重叠(随机子网1、随机子网2):

return(randomSubnet1.first我试图模仿我认为是你的初衷

  • 从25到29生成3个不同的数字以生成3个子列表
  • 从每个元素中选择一个元素
  • 检查3个传感器是否成对重叠
  • 如果它们是,我返回1。如果不是,我返回它们
  • 具体而言,可以突出显示代码中的一些更改:

    • 子网重叠从getRandomIP中分离出来
    • 我只将这些对调用到subnetOverlap(我不确定为什么需要在那里调用IPNetwork,但它似乎是多余的)
    • 我返回chosensubnet,而不是打印它们,然后从函数调用打印它们
    • 我有一个默认的networkIp,它是您测试的常用地址。如果您想返回原始输入,请更改注释。但我肯定会将原始输入放在函数的外部或内部,而不是作为默认变量
    希望有帮助

    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)
    
    随机导入
    从NetAddress导入*
    进口itertools
    def子网重叠(随机子网1、随机子网2):
    
    返回(randomSubnet1.首先,您尝试生成3个重叠的子网。这些术语是如何定义的?您试图满足什么条件?您说这有时会进入无限循环。对于这样的问题,您需要提供代码来清楚地说明问题,这对于接受user输入,然后使用
    random
    生成值。我建议您使用硬编码值为随机数生成器种子,并为
    getRandomIP()指定参数值
    这两者一起会导致这种情况发生。这也可能有助于您自己调试代码。顺便说一句,通常您不会将函数放入另一个函数中。您可以将subnetOverlap函数拉到getRandomIP函数之外。但我离题了。您为什么不1.生成第一个子网;2.而1.生成另一个子网,然后f它与第一个子网重叠,中断循环。3.1.生成另一个子网,如果它与前两个子网重叠,则中断循环。4.返回结果感谢到目前为止的反馈。@DrXorile,我实际上已经在执行这些步骤。我生成第一个子网,然后生成第二个子网并比较它们。如果有重叠存在时,我将跳出循环并生成另一个不重叠的子网。完成后,我将生成最后一个子网并检查它是否与前两个子网重叠(组合为我完成此工作)。如果没有重叠,整个脚本将停止。非常感谢您的帮助,Xorile博士!这肯定是对代码的改进。但是,它还没有完全工作。我可能需要进行一些调整,以避免重叠。现在我仍然偶尔有重叠。您能举个例子吗?如果您的重叠函数是工作中,我找不到解决问题的方法。业余时间!继续在for循环中而不是while循环中进行。我已经更正了。啊,当然!今天没有太多时间思考,但这确实是个问题。我现在已经得到了我的答案,我非常感谢你!除了高兴之外,什么都没有。请把答案也标记出来!