2014-10-07 40 views
0

它會返回一個隨機電話號碼XXX-XXX-XXXX有以下限制:製作隨機電話號碼XXX-XXX-XXXX

  • 區號不能以零開始,
  • 沒有的中間三位數字可以是9,
  • 中間三位數字不能是000,
  • 後四位數字不能全部相同。
+0

應的最後一位 - 'C'有4個數字? – Beginner 2014-10-07 00:26:34

+1

你需要學習如何使用while循環。具體而言,您需要圍繞每個隨機數生成器進行循環,只有當隨機數符合您的條件時纔會退出循環。 – Basic 2014-10-07 00:38:31

+1

您可能想知道的一件事是,您的要求允許爲北美洲電話號碼生成無效的電話號碼。官方標準被稱爲[NANP](http://en.wikipedia.org/wiki/North_American_Numbering_Plan) – 2014-10-07 01:00:13

回答

1

稍微簡單的解決方案。

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

有未定義時間的缺點(根據[墨菲定律](https://en.wikipedia.org/wiki /墨菲%27s_law),它會在某個時候窒息)。 – 2014-10-07 01:01:17

+0

在這種情況下,隨機選擇一個錯誤的電話號碼的概率只有0.1%左右(90億個可能數字中有9990010個壞數字),但記住這一點非常重要。 – 2014-10-07 01:29:39

1
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 
+0

我即將發佈的答案和發佈的答案中的相似性很可怕。 – Beginner 2014-10-07 00:31:07

+0

@gmart看我的編輯。 – CoryKramer 2014-10-07 00:43:26

+1

'makeLast'永遠不會返回數字相同的2或3個數字。所以像425-426-8999這樣的東西是不可能的。 – 2014-10-07 00:50:09

3

我試圖OP,@ kgull,@結合網絡的代碼和@ 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'