2014-01-10 5 views
2

Я не могу сделать случайные простые числа, используя этот код, пожалуйста, кто-нибудь может мне помочь?Создание больших простых чисел в python

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

На каждой итерации цикла 'for' вы игнорируете то, что говорили предыдущие итерации, устанавливая' prime = False' или 'prime = True', не учитывая, что раньше было' prime'. – user2357112

ответ

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 

Read 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) 
+0

OP только хочет «возвратить», как только будет найдено штрих, а не 'return False' - он должен зациклиться на новом случайном числе. – jonrsharpe

+0

@ jonrsharpe Я смущен ... поэтому, пожалуйста, еще раз проверьте ... –

+0

'else' цикла' for' выполняется, если цикл * не * ломается, поэтому вы должны установить 'prime = True' там. Но на самом деле вы можете заменить все это на 'prime = all (n% x! = 0 для x в диапазоне (3, int (n ** 0,5), 2)'. –

0

Посмотрите на вкладки, на другой должен относиться ко всему для цикла, не КРП

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 
+0

Учитывая, что в цикле даже нет 'break', это не правильный ответ. – user2357112

0

Там вы ошибки в коде:

  1. Неверная "еще:"; вы не можете объявить число простым, если остаток не равен 0; Все remaiders должны быть не нули
  2. INT (п * 0.5) должно быть Int (п * 0,5 + 1), для предотвращения округления ошибок

Возможное решение

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 
3

Представьте себе, что произойдет, если число последний в 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.

Однако, имейте в виду, что, для простоты, если любой этих проверок Falsen не является простым. Вы можете использовать это и в 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).

+0

очень хороший ответ. –

Смежные вопросы