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

2024-04-26 07:20:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须在一个特定的网络中随机选择三个子网。网络本身总是有一个/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()

Tags: 代码inimportipforrandomnetworkprint
1条回答
网友
1楼 · 发布于 2024-04-26 07:20:33

我试图模仿你的初衷。具体来说,我

  1. 生成3个从25到29的数字,生成3个子网列表
  2. 从每个元素中选择一个元素
  3. 检查3个是否成对重叠。在
  4. 如果是,我就回到1。否则我就把它们还给你。在

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

  • subnetOverlap从getRandomIP中分离出来
  • 我只将这些对调用到子网overlap中(我不知道为什么要在那里调用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)

相关问题 更多 >