Python:如何生成12位随机数?

Raj*_*eev 13 python

在Python中,如何生成12位随机数?有没有我们可以指定范围的功能random.range(12)

import random
random.randint()
Run Code Online (Sandbox Code Playgroud)

输出应为12位数字的字符串,范围为0-9(允许前导零).

Inb*_*ose 32

直截了当的方法有什么问题?

>>> import random
>>> random.randint(100000000000,999999999999)
544234865004L
Run Code Online (Sandbox Code Playgroud)

如果你想要它带有前导零,你需要一个字符串.

>>> "%0.12d" % random.randint(0,999999999999)
'023432326286'
Run Code Online (Sandbox Code Playgroud)

编辑:

我自己解决这个问题的方法是这样的:

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)
Run Code Online (Sandbox Code Playgroud)

测试结果:

>>> 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
Run Code Online (Sandbox Code Playgroud)

速度计时方法:

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)
Run Code Online (Sandbox Code Playgroud)

速度测试结果:

>>> 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
Run Code Online (Sandbox Code Playgroud)

它告诉我们的是什么:

对于长度大约6000个字符以下的任何数字,我的方法更快 - 有时更快,但对于更大的数字,arshajii建议的方法看起来更好.


ins*_*get 5

random.randrange(10**11, 10**12)。它像randint见面一样工作range

从文档中:

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.
Run Code Online (Sandbox Code Playgroud)

这实际上就像在做random.choice(range(10**11, 10**12))or random.randint(10**1, 10**12-1)。由于它遵循与相同的语法range(),因此比这两种替代方案更加直观和简洁

如果允许前导零:

"%012d" %random.randrange(10**12)
Run Code Online (Sandbox Code Playgroud)

  • @cmh:因为`randrange()`不*不包含端点。您必须使用`random.randint(10 ** 11,10 ** 12-1)`。 (3认同)
  • 为什么要在`random.randint(10 ** 11,10 ** 12)上使用`random.randrange(10 ** 11,10 ** 12)`? (2认同)
  • @cmh:[randint(a,b)的实现]](http://hg.python.org/cpython/file/2.7/Lib/random.py#l237)* use *`randrange(a,b +1)`。直接使用`randrange()`意味着您可以节省堆栈压入,这会更快一些。 (2认同)