Pythonのランダム文字列


96

Pythonでランダムな文字列を作成するにはどうすればよいですか?

私はそれが数字である必要があり、あなたが完了するまで文字が繰り返されますこれが私が作成したものです

def random_id(length):
    number = '0123456789'
    alpha = 'abcdefghijklmnopqrstuvwxyz'
    id = ''
    for i in range(0,length,2):
        id += random.choice(number)
        id += random.choice(alpha)
    return id

より具体的に、探しているものの例をいくつか挙げてください。
sberry

回答:


223

(たとえば)小文字から文字列を生成する:

import random, string

def randomword(length):
   letters = string.ascii_lowercase
   return ''.join(random.choice(letters) for i in range(length))

結果:

>>> randomword(10)
'vxnxikmhdc'
>>> randomword(10)
'ytqhdohksy'

3
これまでのベストアンサー。とを使用randomword(length, source_alpha=string.lowercase)xrange(length)ます。
Hank Gay

1
これは非常に良い答えですが、OPはそれを無効にするように質問を変更したことに注意してください。そして、彼/彼女自身の答えを提供すること。
ブレアコンラッド

29
Python 3との互換性を保つには、次を使用しますstring.ascii_lowercase
dogwynn

@BlairConrad:私は質問が広すぎるなどだったと思いますが、os.urandom(length)回答元の質問と@sthが誤っOPの心を読んでいました。
jfs

1
Python 3.6から、random.choicesより高速になります。
IanS

58

この質問はかなりランダムであるので、これはあなたのために働くかもしれません:

>>> import uuid
>>> print uuid.uuid4()
58fe9784-f60a-42bc-aa94-eb8f1a7e5c17

6
多くの場合、ランダムは実際には必要ありません。むしろ、本当に必要なのはユニークなものだけです。
Chase Seibert

1
str(uuid.uuid4())文字列として使用する場合に使用できます。
スワガティカ

2
str(uuid.uuid4()).split("-")[0]出力:'4bcb6450'
Vlad Gulin

良い点は、Vlad。もっと長い場合は、 ''。join(str(uuid.uuid4())。split( '-'))も機能します。出力: '00db8a458c71415c9a263ff08667dd93'
Brandon

35
>>> import random
>>> import string
>>> s=string.lowercase+string.digits
>>> ''.join(random.sample(s,10))
'jw72qidagk

きちんと!私は実際にこれをランダムパスワードジェネレーターに使用しています!ありがとう!
チャンディー

13
random.sampleは、sから一意の文字をサンプリングします。つまり、パスワードの文字は繰り返されません。これは、受け入れられた回答のようにrandom.choiceを使用するよりも安全性がかなり低くなります。
Nick Zalutskiy、2012年

3
@NickZalutskiy:random.choice安全でもありません。使用するrandom.SystemRandom().choice()os.urandom()直接使用してください。
jfs

1
警告!上記の2つのコメントに注意してください。random.sampleは一意のサンプルを返します。文字は繰り返されません。したがって、返される文字列はランダムではありません。大きな文字列エラーの場合:「ValueError:母集団よりも大きいサンプル」。
gaoithe

1
Python 3では、次のlowercaseものに置き換える必要がありますascii_lowercase
Attaque

18

元の質問への回答:

os.urandom(n)

引用:http : //docs.python.org/2/library/os.html

暗号化の使用に適したnバイトのランダムな文字列を返します。

この関数は、OS固有のランダム性ソースからランダムなバイトを返します。正確な品質はOSの実装に依存しますが、返されるデータは、暗号化アプリケーションにとって十分に予測できないものでなければなりません。UNIXライクなシステムでは、これは/ dev / urandomを照会し、WindowsではCryptGenRandomを使用します。ランダムソースが見つからない場合、NotImplementedErrorが発生します。

プラットフォームが提供する乱数ジェネレーターへの使いやすいインターフェースについては、random.SystemRandomを参照してください。


5

次のようなランダムなASCII文字を作成できます。

import random
print chr(random.randint(0,255))

そして、次のような長い文字列を作成します。

len = 50
print ''.join( [chr(random.randint(0,255)) for i in xrange(0,len)] )

1
文字列フォーマットを使用する理由 ''.join(map(chr, random.randint(0,256) for _ in xrange(len)))
Chris Lutz

5

必要なランダム文字列の種類については、あまり言っていません。ただし、いずれの場合も、randomモジュールを調べる必要があります。

非常にシンプルなソリューションを以下に貼り付けます。

import random

def randstring(length=10):
    valid_letters='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    return ''.join((random.choice(valid_letters) for i in xrange(length)))

print randstring()
print randstring(20)

fyiでは、returnステートメントで最も外側の括弧のセットを省略できます。
2010年

4

時々、半発音可能で半記憶可能なランダムな文字列が欲しかった。

import random

def randomWord(length=5):
    consonants="bcdfghjklmnpqrstvwxyz"
    vowels="aeiou"

    return "".join(random.choice((consonants,vowels)[i%2]) for i in range(length))

そして、

>>> randomWord()
nibit
>>> randomWord()
piber
>>> randomWord(10)
rubirikiro

4文字の単語を避けるには、4に設定しないでくださいlength

ジム


3
random_name = lambda length: ''.join(random.sample(string.letters, length))

長さは<= len(string.letters)= 53でなければなりません。結果の例

   >>> [random_name(x) for x in range(1,20)]
['V', 'Rq', 'YtL', 'AmUF', 'loFdS', 'eNpRFy', 'iWFGtDz', 'ZTNgCvLA', 'fjUDXJvMP', 'EBrPcYKUvZ', 'GmxPKCnbfih', 'nSiNmCRktdWZ', 'VWKSsGwlBeXUr', 'i
stIFGTUlZqnav', 'bqfwgBhyTJMUEzF', 'VLXlPiQnhptZyoHq', 'BXWATvwLCUcVesFfk', 'jLngHmTBtoOSsQlezV', 'JOUhklIwDBMFzrTCPub']
>>> 

楽しい。;)



0

この関数は、大文字、小文字、数字で構成されるランダムな文字列を生成し、長さの区切り記号no_of_blocksを渡して文字列形式を指定します

例:len_sep = 4、no_of_blocks = 4は次のパターンを生成します。

F4nQ-Vh5z-JKEC-WhuS

ここで、長さセパレーターは4文字の後に「-」を追加します

XXXX-

どのブロックも、次の文字列を文字列として生成しません

XXXX-XXXX-XXXX-XXXX

単一のランダム文字列が必要な場合は、no_of_blocks変数を1に保ち、len_sepをランダム文字列の長さを指定するだけにします。

例:len_sep = 10、no_of_blocks = 1、以下のパターンを生成します。ランダムな文字列の長さは10

F01xgCdoDU

import random as r

def generate_random_string(len_sep, no_of_blocks):
    random_string = ''
    random_str_seq = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    for i in range(0,len_sep*no_of_blocks):
        if i % len_sep == 0 and i != 0:
            random_string += '-'
        random_string += str(random_str_seq[r.randint(0, len(random_str_seq) - 1)])
    return random_string

0
import random 
import string

def get_random_string(size):
    chars = string.ascii_lowercase+string.ascii_uppercase+string.digits
    ''.join(random.choice(chars) for _ in range(size))

print(get_random_string(20)

出力:FfxjmkyyLG5HvLeRudDS


0

python3.6+使用できるsecretsモジュール

シークレットモジュールは、パスワード、アカウント認証、セキュリティトークン、関連するシークレットなどのデータを管理するのに適した、暗号学的に強力な乱数を生成するために使用されます。

特に、シークレットは、セキュリティや暗号化ではなく、モデリングとシミュレーション用に設計されたランダムモジュールのデフォルトの疑似乱数ジェネレータよりも優先して使用する必要があります。

768bitセキュリティトークンの生成をテストしたところ、次のことがわかりました。

  • random.choices()- 0.000246
  • secrets.choice()- 0.003529

secretsモジュール遅いですが、それをテストするの外では、暗号化の目的のために使用されなければならないものです。

import string, secrets

def random_string(size):        
        letters = string.ascii_lowercase+string.ascii_uppercase+string.digits            
        return ''.join(secrets.choice(letters) for i in range(size))

print(random_string(768))

-1

ランダムインポートから以下のパッケージをインポートしてみてください*


これはまったく問題に対処していません。このパターンをランダムに生成する(pythonic)より良い方法はありますか
drekbour
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.