уникальный пин-генератор - PullRequest
       4

уникальный пин-генератор

0 голосов
/ 17 сентября 2009

Задача состоит в том, чтобы сгенерировать заданное количество числовых выводов заданной длины. Вот код, который я придумал для конкретного случая числовых выводов, которые не начинаются с 0:

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

Как бы вы это реализовали?

РЕДАКТИРОВАТЬ: Булавки не должны повторяться.

EDIT2: возможно, давайте расширим этот пример, чтобы вывод мог содержать любой буквенно-цифровой символ.

Ответы [ 2 ]

7 голосов
/ 17 сентября 2009

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)]

При дополнительное условие, чтобы все возвращаемые контакты были уникальными:

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)

при условии, что спецификации требуют, чтобы вы вернули список.

Редактировать : с учетом позднего разъяснения ОП и изменения спецификации второй ответ выглядит хорошо, за исключением string.ascii_lowercase + string.digits (или некоторых его вариантов, например, если требуются как строчные, так и прописные буквы ASCII), которые должны использоваться в onepin. Вы должны точно указать, из какой именно строки «алфавита» вы хотите рисовать символы (возможно, передайте ее generate_pins в качестве аргумента, с None, указывающим generate_pins, следует выбрать алфавит по умолчанию, например, string.digits).

Дальнейшее редактирование : добавлен необязательный аргумент алфавита и проверяется количество отдельных выводов, которые могут быть сгенерированы с учетом длины и этого алфавита.

1 голос
/ 17 сентября 2009

Поскольку ОП не называет случайные ПИН-коды, уникальными пинами кажутся только критерии вот самый быстрый способ

def generate_pins(length, count):
  start=10**length
  return range(start,start+count,1)

также вы не всегда можете гарантировать уникальность, одинаковую длину и количество одновременно например попробуйте generate_pins (1,11) для ответа Алекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...