Есть ли более эффективный способ написать это, чтобы он не зацикливался от 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)
То же, что и
return (seed + (n - 1) * incrementor) % modulo
(Вы уверены, что хотите n - 1
? Это то, что вы делаете в текущем коде.)
n = 0
. Я все еще сомневаюсь, что вы действительно хотите n - 1
там. Ваш код даст тот же ответ для n = 0
и n = 1
.