想象一下如果在range(3, int(n**0.5), 2)
的最後數不是n
整數除數:
if n % x ==0:
prime = False # not this
else:
prime = True # this
所以即使所有以前的檢查評估False
,你叫n
一個素數。該最小改變了代碼解決這個問題是:
prime = prime and True # or 'prime &= True'
所以,如果prime
是已經False
,它仍然False
。
但是,請記住,對於素數,如果這些檢查的任何是False
n
是不是質數。您可以使用此和Python的and
和all
(這是懶洋洋地評估,即不繼續檢查,一旦發現一個False
),以更有效地實現:
def rand_prime():
while True:
p = randint(10000, 100000)
if (r % 2 != 0 and
all(p % n != 0 for n in range(3, int(((p ** 0.5) + 1), 2))):
return p
爲了更好的性能,請注意randrange
採用了step
的論點,就像range
,所以你可以跳過所有的偶數(這肯定不是素數!):
def rand_prime():
while True:
p = randrange(10001, 100000, 2)
if all(p % n != 0 for n in range(3, int((p ** 0.5) + 1), 2)):
return p
注:sqrt(n)
(從math
),在我看來,更清晰以外,技術讀者少一點比n ** 0.5
(雖然它may or may not be more efficient)。
在'for'循環的每次迭代中,您忽略了早期迭代通過設置'prime = False'或'prime = True'告訴您的情況,而不考慮'prime'曾經是什麼。 – user2357112