Если скорость не критична, то:
def rand(l=4):
if l > 10 or l < 1:
return None
seen = set()
rlist = []
while True:
r = random.randint(0,9)
seen.add(r)
rlist.append(r)
if len(seen) < len(rlist):
del rlist[-1]
if len(rlist) >= l:
break
return int(''.join(str(e) for e in rlist))
но лучше наверное будет так:
def rand2(l=4):
if l > 10 or l < 1:
return None
choiceList = range(10)
rlist = []
while len(rlist)<l and len(choiceList)>0:
r = random.choice(choiceList)
rlist.append(r)
choiceList = list(set(choiceList) - set([r]))
return int(''.join(str(e) for e in rlist))
исключаем из выборки уже выбранные цифры.