18

Pythonで、12桁の乱数を生成するにはどうすればよいですか?次のような範囲を指定できる関数はありますrandom.range(12)か?

import random
random.randint()

出力は、0〜9の範囲の12桁の文字列である必要があります(先行ゼロを使用できます)。

4

6 に答える 6

38

単純なアプローチの何が問題になっていますか?

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

また、先行ゼロを使用したい場合は、文字列が必要です。

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

編集:

この問題に対する私自身の解決策は次のようになります。

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)

テスト結果:

>>> 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

速度のタイミング方法:

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)

スピードテストの結果:

>>> 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

それが私たちに伝えること:

長さが約6000文字未満の数字の場合、私の方法はより高速です。場合によってははるかに高速ですが、数値が大きい場合は、arshajiiによって提案された方法の方が適しています。

于 2012-11-21T15:14:30.697 に答える
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.

これは事実上、random.choice(range(10**11, 10**12))またはのようなものrandom.randint(10**1, 10**12-1)です。と同じ構文に準拠しているためrange()、これら2つの選択肢よりもはるかに直感的でクリーンです。

先行ゼロが許可されている場合:

"%012d" %random.randrange(10**12)
于 2012-11-21T15:08:01.823 に答える
4

先行ゼロは(コメントによって)許可されているため、次を使用することもできます。

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

編集:もちろん、文字列が必要な場合は、その部分を省略できますint

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

これは私の意見ではそれを行うための最も簡単な方法のようです。

于 2012-11-21T15:14:30.373 に答える
2

これを行うには多くの方法があります。

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))
于 2012-11-21T15:13:28.327 に答える
1
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)
于 2012-11-21T15:10:03.330 に答える
1

これはあなたが探しているものと正確には一致しないかもしれませんが、rstrのようなライブラリではランダムな文字列を生成できます。それであなたが必要とするのは(先行ゼロが許可される)だけです:

import rstr
foo = rstr.digits(12)
于 2012-11-21T15:19:34.963 に答える