我必须在特定网络中选择三个随机子网。网络本身将始终具有/ 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()

最佳答案

我试图模仿我认为是您的初衷。具体来说,我


从25到29生成3个不同的数字,以生成3个subnetList,
从每个元素中选择一个元素,
检查3是否成对重叠。
如果是,则返回1。否则返回。


具体来说,您代码中的一些更改可能会突出显示:


subnetOverlap与getRandomIP分开
我只将这些对称为subnetOverlap(我不确定为什么您需要在那里调用IPNetwork,但这似乎是多余的)
我返回selectedSubnet,而不是打印它们,然后从函数调用中打印它们
我有一个默认的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/

10-12 22:48