DOMANDA Programmare con Python

Mariagiovanna

Nuovo Utente
6
0
Ciao a tutti! Ho da poco iniziato a studiare Python e mi hanno dato un esercizio che proprio non riesco a fare.

L'esercizio è:
Crea un semplice programma, utilizzando numeri casuali, che genererà la somma di due numeri primi trovati casualmente tra 5000 e 10000

So come trovare i numeri primi, so come trovare numeri casuali, so creare un range ma quando vado a mettere tutte le cose insieme non mi da nessun risultato oppure errore🥺

C'è qualcuno che potrebbe darmi la soluzione cosi da poter capire come poter mettere le cose in un unico programma? Grazie.

Se avete da consigliare anche siti o libri dove poter approfondire Python ve ne sono grata. Grazie.
 

Mariagiovanna

Nuovo Utente
6
0
Ciao a tutti! Ho da poco iniziato a studiare Python e mi hanno dato un esercizio che proprio non riesco a fare.

L'esercizio è:
Crea un semplice programma, utilizzando numeri casuali, che genererà la somma di due numeri primi trovati casualmente tra 5000 e 10000

So come trovare i numeri primi, so come trovare numeri casuali, so creare un range ma quando vado a mettere tutte le cose insieme non mi da nessun risultato oppure errore🥺

C'è qualcuno che potrebbe darmi la soluzione cosi da poter capire come poter mettere le cose in un unico programma? Grazie.

Se avete da consigliare anche siti o libri dove poter approfondire Python ve ne sono grata. Grazie.
La prova che ho fatto è questa

import random
x = random.randrange(5000, 10000)
y = random.randrange(5000, 10000)

for i in range(5000, 10000):
for j in range(2, i)
if i%j == 0:
break
else:
print(x+y)


Questo è quello che ho fatto premettendo che sono molto molto beginners e mi scuso se si vede qualcosa di assurdo per i più esperti.
L'output effettivamente dà un risultato, ma quello che vorrei sapere ora è:
-il risultato è effettivamente la somma di due numeri primi? Come faccio a saperlo?
-non sono sicura che il programma rispecchia quello che chiedono.
-perché mi dà uno stesso risultato tante volte e non diversi risultati?

Grazie, spero di non aver infranto il regolamento questa volta.
 

Hero467

Utente Attivo
689
404
OS
I use ARCH btw
Prima di tutto ti suggerisco di postare il codice mettendo il tag code.

Ma veniamo a noi.
Qui:
Python:
x = random.randrange(5000, 10000)
y = random.randrange(5000, 10000)
Estrai si due numeri casuali, ma non controlli se sono primi. Infatti qui
Python:
        else:
            print(x+y)
Fai la somma tra queste due e stampi il risultato, senza controllare che siano numeri primi appunto



Poi, il motivo per cui ti stampa il risultato così tante volte (sulla correttezza del risultato veniamo dopo) è perché nel range() metti 5000 e 10000, quindi ti stamperà il risultato 5000 volte. Personalmente quel for non l’avrei messo

poi quel i%j == 0 non sarà mai vero, perché j parte da 2 e deve dividersi con i, che nel migliore dei casi sarà 5000. Quindi 2%5000 non fa 0.




Io personalmente farei così:
Python:
from random import randint

def isPrime(num):
    """
    Questa funzione controlla se un numero "num", passatogli come parametro,
    è primo. Se il num è 1, 2, 3, 5 o 7 restituisce True.
    Se num non è divisibile per nessuno di essi restituisce True.
    Se no restituisce False
    """
    if num in (1, 2, 3, 5, 7): return True
 
    if num % 2 != 0 and num % 3 != 0 and num % 5 != 0 and num % 7 != 0:
        return True
    
    return False
 
# Estrazione casuale dei due numeri
x = randint(5000, 10000)
y = randint(5000, 10000)


# Qui controlla se entrambi i numeri sono primi, passandoli come parametri alla
# funzione isPrime(). Se la funzione restituisce True allora il ciclo si
# interrompe, se no assegna un nuovo valore alle variabili, finché non è un numero primo
while not isPrime(x):
    x = randint(5000, 10000)
 
while not isPrime(y):
    y = randint(5000, 10000)
 
 
# Dopo essersi accertato che sia x che y siano primi, li somma e stampa il risultato
print(x + y)

Se hai bisogno di chiarimenti chiedi pure
 
  • Arrabbiato
Reazioni: BAT

Mariagiovanna

Nuovo Utente
6
0
Prima di tutto ti suggerisco di postare il codice mettendo il tag code.

Ma veniamo a noi.
Qui:

Estrai si due numeri casuali, ma non controlli se sono primi. Infatti qui

Fai la somma tra queste due e stampi il risultato, senza controllare che siano numeri primi appunto



Poi, il motivo per cui ti stampa il risultato così tante volte (sulla correttezza del risultato veniamo dopo) è perché nel range() metti 5000 e 10000, quindi ti stamperà il risultato 5000 volte. Personalmente quel for non l’avrei messo

poi quel i%j == 0 non sarà mai vero, perché j parte da 2 e deve dividersi con i, che nel migliore dei casi sarà 5000. Quindi 2%5000 non fa 0.




Io personalmente farei così:
Python:
from random import randint

def isPrime(num):
    """
    Questa funzione controlla se un numero "num", passatogli come parametro,
    è primo. Se il num è 1, 2, 3, 5 o 7 restituisce True.
    Se num non è divisibile per nessuno di essi restituisce True.
    Se no restituisce False
    """
    if num in (1, 2, 3, 5, 7): return True
 
    if num % 2 != 0 and num % 3 != 0 and num % 5 != 0 and num % 7 != 0:
        return True
   
    return False
 
# Estrazione casuale dei due numeri
x = randint(5000, 10000)
y = randint(5000, 10000)


# Qui controlla se entrambi i numeri sono primi, passandoli come parametri alla
# funzione isPrime(). Se la funzione restituisce True allora il ciclo si
# interrompe, se no assegna un nuovo valore alle variabili, finché non è un numero primo
while not isPrime(x):
    x = randint(5000, 10000)
 
while not isPrime(y):
    y = randint(5000, 10000)
 
 
# Dopo essersi accertato che sia x che y siano primi, li somma e stampa il risultato
print(x + y)

Se hai bisogno di chiarimenti chiedi pure
Grazie mille!!! Ho ancora molto da imparare!! 🥲 la tua risposta mi fa anche capire quali lacune devo colmare
 

Hero467

Utente Attivo
689
404
OS
I use ARCH btw
Grazie mille!!! Ho ancora molto da imparare!! 🥲 la tua risposta mi fa anche capire quali lacune devo colmare
Figurati.
Non preoccuparti, col tempo imparerai quello che ti serve. È solo questione di imparare la sintassi e di un po’ di elasticità mentale.
Piuttosto, nel codice ho usato le funzioni per tenerlo un po’ più pulito, ma non se le hai fatte. Magari ti ho complIcaro le cose inutilmente
 

Mariagiovanna

Nuovo Utente
6
0
Figurati.
Non preoccuparti, col tempo imparerai quello che ti serve. È solo questione di imparare la sintassi e di un po’ di elasticità mentale.
Piuttosto, nel codice ho usato le funzioni per tenerlo un po’ più pulito, ma non se le hai fatte. Magari ti ho complIcaro le cose inutilmente
È molto chiaro, grazie, ho fatto le funzioni, ma arrivando da un background scientifico devo, come dici tu, imparare la sintassi e avere più elasticità mentale.
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,948
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Io personalmente farei così:
la funzione isPrime() che hai scritto è completamente senza senso: da quando i numeri primi sono tutti quelli non divisibili per 2,3,5,7?
inoltre 1 NON è un numero primo ☝️
la funzione ritorna true (sbagliando) su tutti gli interi composti che hanno fattori primi dall'11 in poi, esempio:
121 = 11*11 (quindi non è primo) ma 121 non è divisibile per 2,3,5,7 e isPrime(121) ritorna true 😡

Definizione (informale) di numero primo:
un intero n>1 è primo se e solo se i suoi unici divisori sono 1 ed n

A peggiorare le cose, entrambi i cicli while successivi alla chiamata di isPrime() potrebbero causare la non-terminazione del programma nel caso che il randomizzatore NON generi (mai) un numero primo (improbabile ma teoricamente possibile, anche se va considerato che prima o poi il randomizzatore genererà tutti i numeri dell'intervallo e quindi prima o poi un primo lo "becca" -> il motivo è che i randomizzatori inclusi nei linguaggi di programmazione tendono a generare una distribuzione uniforme dei numeri che possono generare con il loro algoritmo);
tuttavia almeno questo non è colpa tua, l'esercizio è pensato male da parte di chi lo ha assegnato, coi numeri primi non si scherza, a meno che il testo preciso dell'eserizio non sia un altro e che in realtà l'input sia già di suo una lista di primi compresi tra 5000 e 10000 (ossia i numeri primi non sono da "trovare" ma semplicemente da estrarre a caso da una lista di primi).
 

Hero467

Utente Attivo
689
404
OS
I use ARCH btw
la funzione isPrime() che hai scritto è completamente senza senso: da quando i numeri primi sono tutti quelli non divisibili per 2,3,5,7?
inoltre 1 NON è un numero primo ☝️
la funzione ritorna true (sbagliando) su tutti gli interi composti che hanno fattori primi dall'11 in poi, esempio:
121 = 11*11 (quindi non è primo) ma 121 non è divisibile per 2,3,5,7 e isPrime(121) ritorna true 😡
A mia discolpa posso dire che mi è stato sempre insegnato così, elementari, medie e superiori. È effettivamente colpa mia che io abbia dato per scontato e non abbia mai approfondito.
È anche colpa mia per l'1. Ero distratto, e nella confusione mi sono detto che l'1 doveva essere primo.

A peggiorare le cose, entrambi i cicli while successivi alla chiamata di isPrime() potrebbero causare la non-terminazione del programma nel caso che il randomizzatore NON generi (mai) un numero primo (improbabile ma teoricamente possibile, anche se va considerato che prima o poi il randomizzatore genererà tutti i numeri dell'intervallo e quindi prima o poi un primo lo "becca" -> il motivo è che i randomizzatori inclusi nei linguaggi di programmazione tendono a generare una distribuzione uniforme dei numeri che possono generare con il loro algoritmo);
tuttavia almeno questo non è colpa tua, l'esercizio è pensato male da parte di chi lo ha assegnato, coi numeri primi non si scherza, a meno che il testo preciso dell'eserizio non sia un altro e che in realtà l'input sia già di suo una lista di primi compresi tra 5000 e 10000 (ossia i numeri primi non sono da "trovare" ma semplicemente da estrarre a caso da una lista di primi).
A questo si può porre rimedio generando tutti i numeri primi tra 5000 e 10000, e estraendone casualmente uno di essi.

Più tardi o, al massimo, domani allora provo a postare un codice corretto
 
  • Mi piace
Reazioni: Mariagiovanna

BAT

Moderatore
Staff Forum
Utente Èlite
22,948
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
A questo si può porre rimedio generando tutti i numeri primi tra 5000 e 10000, e estraendone casualmente uno di essi.
no
non è richiesto dall'esercizio: concentrati a scrivere la funzione sui numeri primi, ecco i suggerimenti per il test di primalità:
  1. per interi <=4 i primi minori o uguali a 4 sono solo il 2 ed il 3
  2. i numeri pari dal 4 in poi non sono primi
  3. fatti i controlli dei punti precedenti, i divisori da testare sono solo i dispari a partire dal 3 (incluso) 3, 5, 7,... ecc.; ti dimezza il numero di divisori da controllare
  4. per ragioni matematiche, il massimo divisore da controllare è la radice quadrata intera di n, dove n è il numero di cui si testa la primalità
 
  • Mi piace
Reazioni: Andretti60

Mariagiovanna

Nuovo Utente
6
0
la funzione isPrime() che hai scritto è completamente senza senso: da quando i numeri primi sono tutti quelli non divisibili per 2,3,5,7?
inoltre 1 NON è un numero primo ☝️
la funzione ritorna true (sbagliando) su tutti gli interi composti che hanno fattori primi dall'11 in poi, esempio:
121 = 11*11 (quindi non è primo) ma 121 non è divisibile per 2,3,5,7 e isPrime(121) ritorna true 😡

Definizione (informale) di numero primo:
un intero n>1 è primo se e solo se i suoi unici divisori sono 1 ed n

A peggiorare le cose, entrambi i cicli while successivi alla chiamata di isPrime() potrebbero causare la non-terminazione del programma nel caso che il randomizzatore NON generi (mai) un numero primo (improbabile ma teoricamente possibile, anche se va considerato che prima o poi il randomizzatore genererà tutti i numeri dell'intervallo e quindi prima o poi un primo lo "becca" -> il motivo è che i randomizzatori inclusi nei linguaggi di programmazione tendono a generare una distribuzione uniforme dei numeri che possono generare con il loro algoritmo);
tuttavia almeno questo non è colpa tua, l'esercizio è pensato male da parte di chi lo ha assegnato, coi numeri primi non si scherza, a meno che il testo preciso dell'eserizio non sia un altro e che in realtà l'input sia già di suo una lista di primi compresi tra 5000 e 10000 (ossia i numeri primi non sono da "trovare" ma semplicemente da estrarre a caso da una lista di primi).

la funzione isPrime() che hai scritto è completamente senza senso: da quando i numeri primi sono tutti quelli non divisibili per 2,3,5,7?
inoltre 1 NON è un numero primo ☝️
la funzione ritorna true (sbagliando) su tutti gli interi composti che hanno fattori primi dall'11 in poi, esempio:
121 = 11*11 (quindi non è primo) ma 121 non è divisibile per 2,3,5,7 e isPrime(121) ritorna true 😡

Definizione (informale) di numero primo:
un intero n>1 è primo se e solo se i suoi unici divisori sono 1 ed n

A peggiorare le cose, entrambi i cicli while successivi alla chiamata di isPrime() potrebbero causare la non-terminazione del programma nel caso che il randomizzatore NON generi (mai) un numero primo (improbabile ma teoricamente possibile, anche se va considerato che prima o poi il randomizzatore genererà tutti i numeri dell'intervallo e quindi prima o poi un primo lo "becca" -> il motivo è che i randomizzatori inclusi nei linguaggi di programmazione tendono a generare una distribuzione uniforme dei numeri che possono generare con il loro algoritmo);
tuttavia almeno questo non è colpa tua, l'esercizio è pensato male da parte di chi lo ha assegnato, coi numeri primi non si scherza, a meno che il testo preciso dell'eserizio non sia un altro e che in realtà l'input sia già di suo una lista di primi compresi tra 5000 e 10000 (ossia i numeri primi non sono da "trovare" ma semplicemente da estrarre a caso da una lista di primi).
Grazie per i consigli, il testo del compito l'ho tradotto perché io vivo in UK e il corso lo sto facendo qui ma qui non conosco nessuno che possa aiutarmi così ho cercato un forum italiano con persone italiane che potessi capire dato che ho studiato biologia e per me non è tanto semplice capirlo in italiano figuriamoci in inglese, perdo un sacco di tempo a tradurre le lezioni 🥲 l'inglese dell'informatica non è esattamente quello che ho studiato.
Comunque questo è l'esercizio originale, la traduzione è: "Create a simple program, using random numbers, that will generate the sum of two randomly found prime numbers between 5000 and 10000."
Nelle lezioni che mi hanno fatto non hanno mai parlato di come fare le funzioni con i numeri primi in Python, danno per scontato che li abbia fatti chissà dove probabilmente ed è un corso per beginners 😅


la funzione isPrime() che hai scritto è completamente senza senso: da quando i numeri primi sono tutti quelli non divisibili per 2,3,5,7?
inoltre 1 NON è un numero primo ☝️
la funzione ritorna true (sbagliando) su tutti gli interi composti che hanno fattori primi dall'11 in poi, esempio:
121 = 11*11 (quindi non è primo) ma 121 non è divisibile per 2,3,5,7 e isPrime(121) ritorna true 😡

Definizione (informale) di numero primo:
un intero n>1 è primo se e solo se i suoi unici divisori sono 1 ed n

A peggiorare le cose, entrambi i cicli while successivi alla chiamata di isPrime() potrebbero causare la non-terminazione del programma nel caso che il randomizzatore NON generi (mai) un numero primo (improbabile ma teoricamente possibile, anche se va considerato che prima o poi il randomizzatore genererà tutti i numeri dell'intervallo e quindi prima o poi un primo lo "becca" -> il motivo è che i randomizzatori inclusi nei linguaggi di programmazione tendono a generare una distribuzione uniforme dei numeri che possono generare con il loro algoritmo);
tuttavia almeno questo non è colpa tua, l'esercizio è pensato male da parte di chi lo ha assegnato, coi numeri primi non si scherza, a meno che il testo preciso dell'eserizio non sia un altro e che in realtà l'input sia già di suo una lista di primi compresi tra 5000 e 10000 (ossia i numeri primi non sono da "trovare" ma semplicemente da estrarre a caso da una lista di primi).


In realtà tu non devi postare proprio nulla perché il compito non è tuo, ma dell' OP e attualmente si ritrova con una bozza di codice postata da te (da rivedere n'attimo e correggere) e con i suggerimenti postati da BAT. 😅 😝
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili