How to generate a random 4 digit number not starting with 0 and having unique digits?
We generate the first digit in the 1 - 9 range, then take the next 3 from the remaining digits:
import random# We create a set of digits: {0, 1, .... 9}digits = set(range(10))# We generate a random integer, 1 <= first <= 9first = random.randint(1, 9)# We remove it from our set, then take a sample of# 3 distinct elements from the remaining valueslast_3 = random.sample(digits - {first}, 3)print(str(first) + ''.join(map(str, last_3)))
The generated numbers are equiprobable, and we get a valid number in one step.
Just loop until you have something you like:
import randomnumbers = [0]while numbers[0] == 0: numbers = random.sample(range(10), 4)print(''.join(map(str, numbers)))
This is very similar to the other answers but instead of sample
or shuffle
you could draw a random integer in the range 1000-9999 until you get one that contains only unique digits:
import randomval = 0 # initial value - so the while loop is entered.while len(set(str(val))) != 4: # check if it's duplicate free val = random.randint(1000, 9999)print(val)
As @Claudio pointed out in the comments the range actually only needs to be 1023 - 9876 because the values outside that range contain duplicate digits.
Generally random.randint
will be much faster than random.shuffle
or random.choice
so even if it's more likely one needs to draw multiple times (as pointed out by @karakfa) it's up to 3 times faster than any shuffle
, choice
approach that also needs to join
the single digits.