import random
import math
from collections import deque
def digits2number(digits):
return int(''.join([str(d) for d in digits]))
unic_digits = deque(range(0, 10))
num_len = 1 + math.floor(math.log(random.randint(1, 10000), 10))
random.shuffle(unic_digits)
if (unic_digits[0] == 0):
unic_digits.rotate(random.randint(1, 9))
print(digits2number(list(unic_digits)[:int(num_len)]))
Как вариант можно генерировать случайное число сразу из уникальных цифр. Количество разрядов можно тоже выбирать случайно, но делать это нужно с осторожностью, иначе короткие числа будут встречаться слишком часто.
num_len = 1 + math.floor(math.log(random.randint(1, 10000), 10))
Так распределение будет похоже на нормальное (мы генерируем "честное" случайное число и берем количество цифр из него).
upd: Еще более простой способ для фиксированной длины.
import random
import math
def digits2number(digits):
return int(''.join([str(d) for d in digits]))
unic_digits = list(range(10))
num_len = 4
while not unic_digits[0]:
unic_digits = random.sample(unic_digits, num_len)
print(digits2number(unic_digits))