任务是生成给定长度的给定数量的数字引脚。 这是我提出的针对特殊情况的数字引脚的代码,它不以0开头:
def generate_pins(length, count):
return random.sample(range(int('1' + '0' * (length - 1)), int('9' * length)), count)
你会如何实现它?
编辑:别针不应重复。
EDIT2:可能让我们扩展这个例子,以便pin可以包含任何字母数字符号。
答案 0 :(得分:7)
random.sample
保证不重复(“无替换的抽样”,每the docs);这个条件是你的规格的一部分吗?
如表达的那样(没有任何单词“不同”表示没有重复),我会这样做:
import random
import string
def generate_pins(length, count):
return [''.join(random.choice(string.digits) for x in xrange(length))
for x in xrange(count)]
使用附加条件,返回的所有引脚都是唯一的:
def generate_pins(length, count, alphabet=string.digits):
alphabet = ''.join(set(alphabet))
if count > len(alphabet)**length:
raise ValueError("Can't generate more than %s > %s pins of length %d out of %r" %
count, len(alphabet)**length, length, alphabet)
def onepin(length):
return ''.join(random.choice(alphabet) for x in xrange(length))
result = set(onepin(length) for x in xrange(count))
while len(result) < count:
result.add(onepin(length))
return list(result)
假设规范要求您返回列表。
编辑:鉴于OP的最新澄清和规范更改,第二个答案看起来不错,除了string.ascii_lowercase + string.digits
(或其某些变体,例如,如果需要小写和大写ASCII字母)应该在onepin
中使用。您应该更准确地指定要从中绘制字符的“字母”字符串(可能将其作为参数传递给generate_pins
,None
表示generate_pins
应选择默认字母表,例如string.digits
)。
进一步编辑:添加了可选字母表参数,并检查了给定长度和字母表可生成的不同引脚数。
答案 1 :(得分:1)
由于OP没有说随机PIN,因此只有标准似乎是唯一的引脚 这是最快的方式
def generate_pins(length, count):
start=10**length
return range(start,start+count,1)
你也不能总是保证同时,同样的长度和数量 例如为Alex的回答尝试generate_pins(1,11)。