Forum >> Principianti >> Problema con il modulo random

Pagina: 1

Ciao a tutti :) Sono un totale novizio della programmazione, spero che qualcuno possa risolvere il mio problema.

Ho creato uno script semplicissimo: una prima funzione genera un numero casuale tra 1 e 100 tramite il modulo random, se il numero è pari l'evento viene considerato positivo. Il tutto viene ripetuto per 1000 volte.

Una seconda funzione crea un ciclo da 10000 eventi, ognuno dei quali svolge la prima funzione. Alla fine di questa seconda funzione viene riportato il numero dei cicli positivi e di quelli negativi. Questo è lo script.

def EventoCasuale():
    import random
    EventoPositivo = 0
    
    for Evento in range(1000):
        Evento = random.randint(1, 100)
        
        if Evento % 2 == 0:
            EventoPositivo = EventoPositivo + 1
            
    return EventoPositivo


def Ciclo():
    SessioniPositive = 0
    SessioniNegative = 0
    
    for x in range(10000):
        x = EventoCasuale()

        if x <=500:
            SessioniPositive = SessioniPositive + 1
        if x > 500:
            SessioniNegative = SessioniNegative + 1
        
        
    print ("Sessioni positive:", SessioniPositive)
    print ("Sessioni negative:", SessioniNegative)
    print ()
    
    
Ciclo()


Ora il problema è questo: testando il programma, dovrei avere un ovvio alternarsi di eventi positivi e negativi, visto che il programma dovrebbe simulare un evento totalmente casuale al 50/50 ripetuto migliaia di volte. Ma non importa quante volte ci provi, le "sessioni positive" sono sempre superiori a quelle negative. Sembra quasi che la percentuale sia sballata. Ho testato letteralmente il programma 20 volte prima di postare questa domanda, giusto per essere sicuro. Ovviamente sbaglio qualcosa, solo non capisco cosa. Spero che qualcuno possa illuminarmi :)
Ciao caro, ci sono diverse cose che non vanno. Tralascio il fatto che potresti scrivere qualche riga in meno e in maniera più Pythonica, ti aggiusto al volo giusto un paio di cose.

Considera che sono con lo smartphone, quindi perdonami se non sarà tutto formattato con precisione, ma eccoti qualcosa che dovrebbe funzionare meglio (testala ovviamente, io non riesco):
import random

def EventoCasuale():    
 EventoPositivo = 0
 Evento = random.randint(1, 100)
 if Evento % 2 == 0:
  EventoPositivo = 1
 return EventoPositivo

def Ciclo():
 SessioniPositive = 0
 SessioniNegative = 0
 for x in range(10000):
  i = EventoCasuale()
  if i:
   SessioniPositive += 1
  else:
   SessioniNegative += 1
  print ("Sessioni positive:", SessioniPositive)
  print ("Sessioni negative:", SessioniNegative)

Ciclo()

Sperando che tenga la formattazione, fammi sapere se va meglio e soprattutto se ti è chiaro quello che ho scritto.



Cya

Ciao Daniele, prima di tutto grazie per avermi risposto così velocemente. Immaginavo che il programma fosse molto grezzo, devo ancora migliorare parecchio in ogni aspetto. Detto questo la tua modifica è chiarissima, vorrei spiegarti meglio a cosa sto puntando.
Facciamo finta che il programma scritto da me simuli un classico lancio della monetina. Io voglio che il programma simuli 1000 lanci, restituendo poi il numero dei risultati positivi.
Dopo di che voglio che questo ciclo da 1000 eventi venga ripetuto 10000 volte. Ciascuna volta verrà ritornata un'esecuzione positiva se nei 1000 lanci almeno 501 sono stati positivi, negativa se sono stati inferiori. Mi accorgo solo ora di aver invertito eventi positivi e negativi nel mio programma, ma il succo non cambia.

Eseguendo il programma, proprio per via di questo 50/50 di probabilità, una volta gli eventi positivi e una quelli negativi (in media), dovrebbero superare i 5000. Ma nonostante io esegua il programma in continuazione, sono sempre gli eventi positivi ad essere superiori. Questo mi fa pensare che da qualche parte nel mio programma ci sia un errore. Ho modificato il tuo script perché eseguisse la stesse azioni del mio, ma il risultato non cambia. Quindi non capisco, sbaglio qualcosa? :thinking:









Per evitarti la scocciatura di eseguirlo, visto che ci mette un po', questo è uno stamp di 10 esecuzioni appena fatte del primo programma postato, senza modifiche.


--- Ultima modifica di PandaPandoso in data 2017-05-25 12:56:51 ---
Ciao caro, segui la traccia di quello che ti ho scritto perché funziona, l'ho ho appena eseguito e la prima volta ho ottenuto:
Sessioni positive: 4985
Sessioni negative: 5015
Ho aggiunto un semplice:
for i in range(10):
    Ciclo()
...ed ottengo risultati del tutto casuali, come deve essere, e che si alternano tra positive e negative:

Sessioni positive: 4998
Sessioni negative: 5002 

Sessioni positive: 4965
Sessioni negative: 5035 

Sessioni positive: 5035
Sessioni negative: 4965 

Sessioni positive: 5057
Sessioni negative: 4943 

Sessioni positive: 5007
Sessioni negative: 4993 

Sessioni positive: 5005
Sessioni negative: 4995 

Sessioni positive: 5010
Sessioni negative: 4990 

Sessioni positive: 4892
Sessioni negative: 5108 

Sessioni positive: 5031
Sessioni negative: 4969 

Sessioni positive: 4947
Sessioni negative: 5053 
Forse se c'è qualcosa che non ti torna, non è nel codice, ma nelle tue aspettative.

Ciao.
Daniele


p, li { white-space: pre-wrap; }
Probabilmente hai ragione. Grazie mille per il tuo aiuto! :)


Pagina: 1



Esegui il login per scrivere una risposta.