独特的针脚发生器

时间:2009-09-17 03:17:49

标签: python

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

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

你会如何实现它?

编辑:别针不应重复。

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

2 个答案:

答案 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_pinsNone表示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)。