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

前端 未结 6 1275
予麋鹿
予麋鹿 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:19

    Since leading zeros are allowed (by your comment), you could also use:

    int(''.join(str(random.randint(0,9)) for _ in xrange(12)))
    

    EDIT: Of course, if you want a string, you can just leave out the int part:

    ''.join(str(random.randint(0,9)) for _ in xrange(12))
    

    This seems like the most straightforward way to do it in my opinion.

    0 讨论(0)
  • 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.

    0 讨论(0)
  • 2021-01-04 04:22
    from random import randint
    
    def random_with_N_digits(n):
        range_start = 10**(n-1)
        range_end = (10**n)-1
        return randint(range_start, range_end)
    
    print random_with_N_digits(12)
    
    0 讨论(0)
  • 2021-01-04 04:24

    Do random.randrange(10**11, 10**12). It works like randint meets range

    From the documentation:

    randrange(self, start, stop=None, step=1, int=<type 'int'>, default=None, maxwidth=9007199254740992L) method of random.Random instance
        Choose a random item from range(start, stop[, step]).
    
        This fixes the problem with randint() which includes the
        endpoint; in Python this is usually not what you want.
        Do not supply the 'int', 'default', and 'maxwidth' arguments.
    

    This is effectively like doing random.choice(range(10**11, 10**12)) or random.randint(10**1, 10**12-1). Since it conforms to the same syntax as range(), it's a lot more intuitive and cleaner than these two alternatives

    If leading zeros are allowed:

    "%012d" %random.randrange(10**12)
    
    0 讨论(0)
  • 2021-01-04 04:27

    This may not be exactly what you're looking for, but a library like rstr let's you generate random strings. With that all you would need is (leading 0 allowed):

    import rstr
    foo = rstr.digits(12)
    
    0 讨论(0)
  • 2021-01-04 04:38

    There are many ways to do that:

    import random
    
    rnumber1 = random.randint(10**11, 10**12-1) # randint includes endpoint
    rnumber2 = random.randrange(10**11, 10**12) # randrange does not
    
    # useful if you want to generate some random string from your choice of characters
    digits = "123456789"
    digits_with_zero = digits + "0"
    
    rnumber3 = random.choice(digits) + ''.join(random.choice(digits_with_zero) for _ in range(11))
    
    0 讨论(0)
提交回复
热议问题