[英]Trying to make a Python 3 prime number generator
顾名思义,我正在尝试制作一个由Python 3驱动的素数生成器,但我无法使其正常工作。
这是代码:
import random
def main():
d=1
x=random.randint
while True:
d=d+1
if isinstance(x/d, int)==True:
print (x)
else: main()
main()
和错误:
Traceback (most recent call last):
File "/media/mint/casper-rw/ProjectsOrWork/Python/PrimeIdle.py", line 10, in <module>
main()
File "/media/mint/casper-rw/ProjectsOrWork/Python/PrimeIdle.py", line 7, in main
if isinstance(x/d, int)==True:
TypeError: unsupported operand type(s) for /: 'method' and 'int'
代码是最底层的,但是请尝试根据以下建议编写自己的代码,这对您更具教育意义:
x = random.randint
实际上没有调用randint()
main()
。 这将导致堆栈无限增长,并最终溢出。 (如果您知道不会从中返回,则不要进行递归调用)。 另外,您不能轻易地从很深的递归链中return
……您正在通过使用print(x)
来回避这一点。 is_prime()
划分为一个名为generate_divisor()
的生成器和一个谓词函数is_prime()
(返回True / False)。 is_prime()
会直通并返回True。 if (isinstance(x/d, int)==True)
不好,请当心较大x / d的截断错误,请使用if (x%d == 0)
来测试除数。 d = d+1
(或d += 1
),您将生成许多复合除数,并减少了几个素数。 (实际上,您要生成大量的复合除数,例如27或51,然后再用它们测试除数,这是浪费时间,因为您已经测试了3和17的除数。) 。
import random
from math import sqrt, floor
def generate_prime_candidate():
"""Generator to generate random prime candidate"""
yield random.randint() # probably do randint(2, 2**32 -1). You decide.
def find_random_prime():
x = generate_prime_candidate()
while not is_prime(x):
x = generate_prime_candidate()
# Found one!
print(x)
return x
def is_prime(x): # normally we call integers n, floats x, but whatever...
for d in generate_divisors(floor(sqrt(x))): # only search up to sqrt(x)
if x%d == 0:
return False # x is composite - d is a divisor
return True # x is prime
def generate_divisors(dmax):
"""Generate divisors, up to a limit. We exclude numbers easily known to be composite: residue 0,2,4,5,6,8 modulo 10"""
yield 2
yield 3
yield 5 # now for d>5, exclude them by residue
d = 7
while d<dmax:
while (d%10) == 5: # d easily known to be composite
d += 2 # in fact we only need to test [0,2,4,6,8] not 5, since d+=2 is skipping residue 5 anyway
yield d
x=random.randint
没有给x
分配一个随机整数,它分配了randint
函数 。 你应该做:
x = random.randint(min, max)
但是,这是最少的问题-主测试将不起作用,实际上不是生成器函数,因此您在每个递归调用中选择一个新的随机数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.