独特的针脚发生器

yan*_*nko 0 python

任务是生成给定长度的给定数量的数字引脚.这是我提出的针对特殊情况的数字引脚的代码,它不以0开头:

def generate_pins(length, count):
    return random.sample(range(int('1' + '0' * (length - 1)), int('9' * length)), count)
Run Code Online (Sandbox Code Playgroud)

你会如何实现它?

编辑:针不应重复.

EDIT2:可能让我们扩展这个例子,以便pin可以包含任何字母数字符号.

Ale*_*lli 7

random.sample保证不重复(根据文件,"无需替换的抽样" ); 这个条件是你的规格的一部分吗?

如表达的那样(没有任何" 明显 "表示缺乏重复),我会这样做:

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)]
Run Code Online (Sandbox Code Playgroud)

有了附加条件,所有的引脚返回是唯一的:

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)
Run Code Online (Sandbox Code Playgroud)

假设规范要求您返回列表.

编辑:鉴于OP的最后澄清和规格变化,第二个答案看起来不错,除了string.ascii_lowercase + string.digits(或其某些变体,例如,如果需要小写和大写ASCII字母)应该使用onepin.您应该更准确地指定要从中绘制字符的"字母"字符串(可能将其generate_pins作为参数传递,None指示generate_pins应选择默认字母表,例如string.digits).

进一步编辑:添加可选的字母表参数,并检查给定长度和字母表可生成的不同引脚的数量.