Более эффективный способ написать этот простой генератор непоследовательных чисел Python?

1

Есть ли более эффективный способ написать это, чтобы он не зацикливался от 1 до n (который зависает на n == 2 ** 32):

def ns_num(n, seed, modulo, incrementor):
    assert n < modulo

    current = seed # some start value
    for i in xrange(1, n):
        current = (current + incrementor) % modulo

    return current

print ns_num(5, 3250, 87178291199, 17180131327)
print ns_num(2**32, 3250, 87178291199, 17180131327)
  • 0
    Выход тока из цикла for.
  • 1
    Слово «генератор» в Python имеет особое значение. Эта функция не является генератором.
Показать ещё 8 комментариев
Теги:
algorithm

1 ответ

7
Лучший ответ

То же, что и

return (seed + (n - 1) * incrementor) % modulo

(Вы уверены, что хотите n - 1? Это то, что вы делаете в текущем коде.)

  • 1
    Хороший улов! И спасибо за ответ. Не знаю, почему я не мог думать об этом.
  • 0
    @ Брэдфорд: Обратите внимание, что мой код даст другой ответ, чем ваш, для n = 0 . Я все еще сомневаюсь, что вы действительно хотите n - 1 там. Ваш код даст тот же ответ для n = 0 и n = 1 .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню