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 <= 9
first = random.randint(1, 9)
# We remove it from our set, then take a sample of
# 3 distinct elements from the remaining values
last_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 random
numbers = [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 random
val = 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.