生成随机电话号码 xxx-xxx-xxxx

3

它将返回一个随机的电话号码xxx-xxx-xxxx,但需要遵循以下限制:

  • 区号不能以0开头,
  • 中间三位数字不能为9,
  • 中间三位数字不能为000,
  • 最后四位数字不能全相同。

最后一位 - c 应该有4个数字吗? - Beginner
1
你需要学会如何使用while循环。具体来说,你希望在每个随机数生成器周围有一个循环,只有当随机数满足你的条件时才退出。 - Basic
1
有一件你可能想知道的事情,根据你的要求,生成的北美电话号码可能是无效的。官方标准被称为NANP - Scott Chamberlain
2
@Tunechi 删除内容,使剩下的变得无用,并不能解决问题。如果你想掩盖自己的行为,可以点击删除链接来删除整个问题。 - ivan_pozdeev
4个回答

9

我尝试将OP、@kgull、@Cyber的代码和@ivan_pozdeev的关注结合起来,同时满足OP的要求:

>>> def gen_phone():
    first = str(random.randint(100,999))
    second = str(random.randint(1,888)).zfill(3)

    last = (str(random.randint(1,9998)).zfill(4))
    while last in ['1111','2222','3333','4444','5555','6666','7777','8888']:
        last = (str(random.randint(1,9998)).zfill(4))
        
    return '{}-{}-{}'.format(first,second, last)

>>> for _ in xrange(10):
    gen_phone()
    
'496-251-8419'
'102-665-1932'
'262-624-5025'
'230-459-3242'
'355-131-0243'
'488-001-6828'
'244-539-2369'
'896-547-4539'
'522-406-8256'
'789-373-4240'

5
稍微简单点的解决方案。
import random

def phn():
    n = '0000000000'
    while '9' in n[3:6] or n[3:6]=='000' or n[6]==n[7]==n[8]==n[9]:
        n = str(random.randint(10**9, 10**10-1))
    return n[:3] + '-' + n[3:6] + '-' + n[6:]

一种不使用while循环,每次都返回第一个时间的解决方案。

import random

def phn():
    p=list('0000000000')
    p[0] = str(random.randint(1,9))
    for i in [1,2,6,7,8]:
        p[i] = str(random.randint(0,9))
    for i in [3,4]:
        p[i] = str(random.randint(0,8))
    if p[3]==p[4]==0:
        p[5]=str(random.randint(1,8))
    else:
        p[5]=str(random.randint(0,8))
    n = range(10)
    if p[6]==p[7]==p[8]:
        n = (i for i in n if i!=p[6])
    p[9] = str(random.choice(n))
    p = ''.join(p)
    return p[:3] + '-' + p[3:6] + '-' + p[6:]

2
有一个缺点是时间不确定(根据墨菲定律,它会在某个时候出错)。 - ivan_pozdeev
在这种情况下,随机选择到一个错误的电话号码的概率仅约为0.1%(即在90亿个可能的号码中有9990010个错误号码),但是一定要牢记这一点。 - Kyle G

0

这是我的简洁明了的答案。

它允许您以随机格式生成随机电话号码。

def generate_phone_number():
    formats = [
        "({}{}{}) {}{}{}-{}{}{}{}",
        "{}{}{}{}{}{}{}{}{}{}",
        "({}{}{})-{}{}{}-{}{}{}{}",
    ]

    ten_numbers = [random.randint(0, 9) for _ in range(10)]
    return random.choice(formats).format(*ten_numbers)

0
import random

让我们从区号开始。没有前导零,所以只能选择1到9之间的数字。然后剩下的两个数字可以是00到99之间的任何数字。

def makeFirst():
    first_digit = random.randint(1,9)
    remaining = random.randint(0,99)
    return first_digit*100 + remaining

接下来是中间的数字。它们不能为9,所以从0到8进行取样。然后循环直到获得一个有效的情况,如果你碰巧取样到000就抛弃掉。

def makeSecond():
    middle = 0
    while middle == 0:
        middle1 = random.randint(0,8)
        middle2 = random.randint(0,8)
        middle3 = random.randint(0,8)
        middle = 100*middle1 + 10*middle2 + middle3
    return middle

对于最后四个数字,我们将使用random.sample来确保我们不会得到任何重复的数字。
def makeLast():
    return ''.join(map(str, random.sample(range(10),4)))

最后将所有内容连接在一起,并按照电话号码的格式进行排版。
def makePhone():
    first = makeFirst()
    second = makeSecond()
    last = makeLast()
    return '{3}-{3}-{4}'.format(first,second,last)

一些测试
for i in range(5):
    print makePhone()

425-426-8902
473-775-2793
434-624-8356
287-630-4560
861-431-7659

我刚要发布的答案和你发布的答案相似得让人害怕。 - Beginner
1
makeLast 不会返回有两个或三个相同数字的数字。所以像425-426-8999这样的数字是不可能的。 - Kyle G
random.sample 引入了一个额外的限制。这样可以吗? - ivan_pozdeev
要求是“最后4位数字不能全部相同”,我将其变得更加严格,即“最后4位数字不能互相相同”。如果您愿意,我们可以放宽这个要求,但以这种方式一行代码更容易实现。 - Cory Kramer
middle()不能是000吗?用以下方式不是更简单吗... second = ''.join([str(random.randint(0, 8)) for _ in range(3)]) - ssm
@ssm 这仍然有可能生成 000。 - Cory Kramer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接