Python: How to generate a 12-digit random number?

前端 未结 6 1370
予麋鹿
予麋鹿 2021-01-04 03:39

In Python, how to generate a 12-digit random number? Is there any function where we can specify a range like random.range(12)?

import random
ran         


        
6条回答
  •  醉话见心
    2021-01-04 04:21

    Whats wrong with a straightforward approach?

    >>> import random
    >>> random.randint(100000000000,999999999999)
    544234865004L
    

    And if you want it with leading zeros, you need a string.

    >>> "%0.12d" % random.randint(0,999999999999)
    '023432326286'
    

    Edit:

    My own solution to this problem would be something like this:

    import random
    
    def rand_x_digit_num(x, leading_zeroes=True):
        """Return an X digit number, leading_zeroes returns a string, otherwise int"""
        if not leading_zeroes:
            # wrap with str() for uniform results
            return random.randint(10**(x-1), 10**x-1)  
        else:
            if x > 6000:
                return ''.join([str(random.randint(0, 9)) for i in xrange(x)])
            else:
                return '{0:0{x}d}'.format(random.randint(0, 10**x-1), x=x)
    

    Testing Results:

    >>> rand_x_digit_num(5)
    '97225'
    >>> rand_x_digit_num(5, False)
    15470
    >>> rand_x_digit_num(10)
    '8273890244'
    >>> rand_x_digit_num(10)
    '0019234207'
    >>> rand_x_digit_num(10, False)
    9140630927L
    

    Timing methods for speed:

    def timer(x):
            s1 = datetime.now()
            a = ''.join([str(random.randint(0, 9)) for i in xrange(x)])
            e1 = datetime.now()
            s2 = datetime.now()
            b = str("%0." + str(x) + "d") % random.randint(0, 10**x-1)
            e2 = datetime.now()
            print "a took %s, b took %s" % (e1-s1, e2-s2)
    

    Speed test results:

    >>> timer(1000)
    a took 0:00:00.002000, b took 0:00:00
    >>> timer(10000)
    a took 0:00:00.021000, b took 0:00:00.064000
    >>> timer(100000)
    a took 0:00:00.409000, b took 0:00:04.643000
    >>> timer(6000)
    a took 0:00:00.013000, b took 0:00:00.012000
    >>> timer(2000)
    a took 0:00:00.004000, b took 0:00:00.001000
    

    What it tells us:

    For any digit under around 6000 characters in length my method is faster - sometimes MUCH faster, but for larger numbers the method suggested by arshajii looks better.

提交回复
热议问题