我似乎无法使用此代码制作随机素数,请有人帮助我吗?
def RandomPrime():
prime = False
while prime == False:
n = random.randint(10000, 100000)
if n % 2 != 0:
for x in range(3, int(n**0.5), 2):
if n % x ==0:
prime = False
else:
prime = True
return n
答案 0 :(得分:4)
想象一下,如果range(3, int(n**0.5), 2)
中的 last 号码不是n
的整数除数会发生什么:
if n % x ==0:
prime = False # not this
else:
prime = True # this
所以即使所有先前的检查都已评估False
,您也可以将n
称为素数。 minimal 更改为您的代码以解决此问题:
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 })。
答案 1 :(得分:0)
正确的逻辑,您在True
时设置n % x
!第一次= 0
:
for x in range(3, int(n**0.5), 2):
if n % x ==0:
prime = False
else:
prime = True
应该是:
prime = False
for x in range(3, int(n**0.5), 2):
if n % x ==0:
break
else:
prime = True
阅读break and continue Statements, and else Clauses on Loops。
编写等效代码的较短方式是(来自@ Steve Jesso):
prime = all(n % x != 0 for x in range(3, int(n**0.5), 2)
答案 2 :(得分:0)
看一下标签:else应该引用整个for循环,而不是iF
def RandomPrime():
prime = False
while prime == False:
n = random.randint(10000, 100000)
if n % 2 != 0:
for x in range(3, int(n**0.5), 2):
if n % x ==0:
break
else:
prime = True
return n
答案 3 :(得分:0)
您的代码中存在错误:
可能的解决方案是
def RandomPrime():
while True:
n = random.randint(10000, 100000)
if n % 2 == 0:
continue;
prime = True;
for x in range(3, int(n**0.5 + 1), 2):
if n % x == 0:
prime = False;
break;
if prime:
return n