Pythonで特定の長さの乱数を生成する方法


105

3桁の数字が必要なので、次のようになります。

>>> random(3)
563

or

>>> random(5)
26748
>> random(2)
56

回答:


181

ランダムな3桁の番号を取得するには:

from random import randint
randint(100, 999)  # randint is inclusive at both ends

(「3桁まで」ではなく、実際に3桁を意味すると仮定します。)

任意の桁数を使用するには:

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(2)
print random_with_N_digits(3)
print random_with_N_digits(4)

出力:

33
124
5127

7
このソリューションでは、ランダムプールから10 **(n-1)の数値を削除します
Nicu Surdu

5
@NicolaeSurdu:はい、だから私はあなたが「3桁まで」ではなく3桁を意味する
RichieHindle、2012

3
037 3桁の数字で、100より小さい:)。それが私が意味したことです。しかし、そうです、宝くじ以外のアプリケーションの場合、あなたのソリューションは問題ありません;)
Nicu Surdu

@NicolaeSurduこのスニペットはどのようにして037の結果を与えることができますか??? n == 3の場合、(100から1000までの)
ランディントです

3
@moldovean上から読みます:)。私はその数が欲しかったことを意味しました、そしてこの解決策はあなたにその桁数までの数を与えるのではなく、正確にその桁数を与えます。それは私の悪かった、私は括弧内の節を逃した。
Nicu Surdu 2014年

41

文字列(たとえば、10桁の電話番号)として使用する場合は、次のように使用できます。

n = 10
''.join(["{}".format(randint(0, 9)) for num in range(0, n)])

'' .join(str(randint(0、9))for _ in range(n))
Mike Fogel

13

3桁の数値が必要で、001-099を有効な数値にしたい場合は、他の方法よりも速いrandrange / randintを使用する必要があります。文字列に変換するときに、必要な先行ゼロを追加するだけです。

import random
num = random.randrange(1, 10**3)
# using format
num_with_zeros = '{:03}'.format(num)
# using string's zfill
num_with_zeros = str(num).zfill(3)

あるいは、乱数をintとして保存したくない場合は、ワンライナーとしてそれを行うことができます:

'{:03}'.format(random.randrange(1, 10**3))

python 3.6+ワンライナーのみ:

f'{random.randrange(1, 10**3):03}'

上記の出力例は次のとおりです。

  • 「026」
  • 「255」
  • 「512」

関数として実装:

import random

def n_len_rand(len_, floor=1):
    top = 10**len_
    if floor > top:
        raise ValueError(f"Floor {floor} must be less than requested top {top}")
    return f'{random.randrange(floor, top):0{len_}}'

5

0は可能な最初の数字としてカウントされますか?もしそうなら、あなたは必要random.randint(0,10**n-1)です。、そうでない場合random.randint(10**(n-1),10**n-1)。また、ゼロが許可されない場合は、ゼロが含まれている数値を明示的に拒否するか、数値を描画n random.randint(1,9)する必要があります。

余談ですが、randint(a,b)Pythonではない「インデックス作成」を使用して乱数を取得するのは興味深いことa <= n <= bです。のようrangeに機能し、乱数を生成することを期待していたかもしれませんa <= n < b。(閉じた上の間隔に注意してください。)

コメントで回答を考えるとrandrange、これらはクリーナーと交換することができることに注意してください、random.randrange(0,10**n)random.randrange(10**(n-1),10**n)random.randrange(1,10)


@Andrew:a <= n <= b私も驚いた。私はそれを-1コードに追加する必要があることに憤慨しています。:-)
RichieHindle 2010

1
@Andrew-おかしなrandintことに、(Lib / random.pyにある)のPythonコードは実際にはrandrange(a, b+1)
Daniel G

4

あなたが望むことをするための小さな関数を自分で書くことができます:

import random
def randomDigits(digits):
    lower = 10**(digits-1)
    upper = 10**digits - 1
    return random.randint(lower, upper)

基本的に10**(digits-1)は、最小の{数字}桁の数字と10**digits - 1最大の{数字}桁の数字(たまたま、最小の{数字+1}桁の数字から1を引いたもの)が得られます。次に、その範囲からランダムな整数を取得します。


0

RichieHindleの答えは本当に気に入りましたが、演習としての質問も気に入りました。文字列を使用したブルートフォースの実装を次に示します。

import random
first = random.randint(1,9)
first = str(first)
n = 5

nrs = [str(random.randrange(10)) for i in range(n-1)]
for i in range(len(nrs))    :
    first += str(nrs[i])

print str(first)

0

公式ドキュメントから、sample()メソッドがこの目的に適していると思われませんか?

import random

def random_digits(n):
    num = range(0, 10)
    lst = random.sample(num, n)
    print str(lst).strip('[]')

出力:

>>>random_digits(5)
2, 5, 1, 0, 4

0

次のように、intのリストを使用する関数を作成し、文字列に変換してdo intを連結してキャストし直すことができます。

import random

def generate_random_number(length):
    return int(''.join([str(random.randint(0,10)) for _ in range(length)]))

特定の長さの数を生成しない:(
プロメテウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.