How to generate random strings in Python?

PythonStringRandom

Python Problem Overview


How do you create a random string in Python?

I need it to be number then character, repeating until the iteration is done.

This is what I created:

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

Python Solutions


Solution 1 - Python

Generating strings from (for example) lowercase characters:

import random, string

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

Results:

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

Solution 2 - Python

Since this question is fairly, uh, random, this may work for you:

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

Solution 3 - Python

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

Solution 4 - Python

Answer to the original question:

os.urandom(n)

Quote from: http://docs.python.org/2/library/os.html

> Return a string of n random bytes suitable for cryptographic use. > > This function returns random bytes from an OS-specific randomness > source. The returned data should be unpredictable enough for > cryptographic applications, though its exact quality depends on the OS > implementation. On a UNIX-like system this will query /dev/urandom, > and on Windows it will use CryptGenRandom. If a randomness source is > not found, NotImplementedError will be raised. > > For an easy-to-use interface to the random number generator provided > by your platform, please see random.SystemRandom.

Solution 5 - Python

You can build random ascii characters like:

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

And then build up a longer string like:

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

Solution 6 - Python

You haven't really said much about what sort of random string you need. But in any case, you should look into the random module.

A very simple solution is pasted below.

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)

Solution 7 - Python

Sometimes, I've wanted random strings that are semi-pronounceable, semi-memorable.

import random

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

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

Then,

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

To avoid 4-letter words, don't set length to 4.

Jim

Solution 8 - Python

In python3.6+ you can use the secrets module:

> The secrets module is used for generating cryptographically strong > random numbers suitable for managing data such as passwords, account > authentication, security tokens, and related secrets. > > In particularly, secrets should be used in preference to the default > pseudo-random number generator in the random module, which is designed > for modelling and simulation, not security or cryptography.

In testing generation of 768bit security tokens I found:

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

The secrets modules is slower but outside of testing it is what you should be using for cryptographic purposes:

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

Solution 9 - Python

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

length must be <= len(string.letters) = 53. result example

   >>> [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']
>>> 

Enjoy. ;)

Solution 10 - Python

Install this package:

pip3 install py_essentials

And use this code:

from py_essentials import simpleRandom as sr
print(sr.randomString(4))

More informations about the method other parameters are available here.

Solution 11 - Python

This function generates random string consisting of upper,lowercase letters, digits, pass the length seperator, no_of_blocks to specify your string format

eg: len_sep = 4, no_of_blocks = 4 will generate the following pattern,

> F4nQ-Vh5z-JKEC-WhuS

Where, length seperator will add "-" after 4 characters

> XXXX-

no of blocks will generate the following patten of characters as string

> XXXX - XXXX - XXXX - XXXX

if a single random string is needed, just keep the no_of_blocks variable to be equal to 1 and len_sep to specify the length of the random string.

eg: len_sep = 10, no_of_blocks = 1, will generate the following pattern ie. random string of length 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

Solution 12 - Python

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)

output : FfxjmkyyLG5HvLeRudDS

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRHickeView Question on Stackoverflow
Solution 1 - PythonsthView Answer on Stackoverflow
Solution 2 - PythonBrandonView Answer on Stackoverflow
Solution 3 - Pythonghostdog74View Answer on Stackoverflow
Solution 4 - PythonTomView Answer on Stackoverflow
Solution 5 - PythonRoss RogersView Answer on Stackoverflow
Solution 6 - PythonMAKView Answer on Stackoverflow
Solution 7 - PythonJimView Answer on Stackoverflow
Solution 8 - PythonStuart CardallView Answer on Stackoverflow
Solution 9 - PythonSpoukView Answer on Stackoverflow
Solution 10 - PythonphyyylView Answer on Stackoverflow
Solution 11 - PythonManoj SelvinView Answer on Stackoverflow
Solution 12 - PythonRakesh babuView Answer on Stackoverflow