Topic: Come generare numeri random  (Letto 83 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Gianpatrizio

  • python unicellularis
  • *
  • Post: 17
  • Punti reputazione: 0
    • Mostra profilo
Come generare numeri random
« il: Maggio 21, 2020, 15:58 »
Buongiorno, piccola premessa: apro questo topic per pura curiosità infatti non troverete nessun codice. Vorrei sapere se possibile generare dei numeri random senza sfruttare la libreria random, è possibile?
Grazie

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.020
  • Punti reputazione: 9
    • Mostra profilo
Re:Come generare numeri random
« Risposta #1 il: Maggio 21, 2020, 17:11 »
Sono assolutamente certo che sia possibile. La prova è che la libreria random, in effetti, genera numeri casuali.

Quindi chi ha scritto la libreria random deve aver trovato il modo di generare numeri casuali senza usare la libreria random.

Offline PyPeppe

  • python unicellularis
  • *
  • Post: 20
  • Punti reputazione: 0
    • Mostra profilo
Re:Come generare numeri random
« Risposta #2 il: Maggio 21, 2020, 19:29 »
Quoto :ok:
Apri la libreria random e guarda il codice  8)

Offline Gianpatrizio

  • python unicellularis
  • *
  • Post: 17
  • Punti reputazione: 0
    • Mostra profilo
Re:Come generare numeri random
« Risposta #3 il: Maggio 21, 2020, 20:03 »
Ok grazie per le risposte, proverò a guardare il codice della librerie

Offline Gianpatrizio

  • python unicellularis
  • *
  • Post: 17
  • Punti reputazione: 0
    • Mostra profilo
Re:Come generare numeri random
« Risposta #4 il: Maggio 21, 2020, 20:10 »
Buongiorno ancora, avendo visto il codice mi sono un po' sconcertato e mi domandavo se esistesse qualcosa di più semplice. Ora io non so se è possibile ma ad esempio una specie di equazione matematica? Davvero scusatemi se le mie parole potrebbero non avere senso.

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.020
  • Punti reputazione: 9
    • Mostra profilo
Re:Come generare numeri random
« Risposta #5 il: Maggio 21, 2020, 22:12 »
Guarda, non è che non hanno senso le tue parole, è che ho paura che non ha tanto senso il modo in cui ti stai ponendo il problema. Voglio dire, se è un esercizio di curiosità intellettuale, allora appunto, perché non provi a stimolare in qualche modo la tua curiosità intellettuale? O almeno la tua capacità di usare google.

Ora, io onestamente non ti avrei suggerito di leggere il sorgente del modulo "random" (anche perché *non* contiene nessuna implementazione reale... ovviamente le implementazioni reali sono scritte in C)... ma visto che te l'hanno suggerito e che apparentemente lo hai fatto, magari ti sarai accorto che c'è scritto che "random" usa un'implementazione del Marsenne Twister... nessuno ovviamente ti chiede di re-implementare un Marsenne Twister, ma potrebbe venirti la curiosità intellettuale (eh già) di dare un'occhiata alla pagina di wikipedia del Marsenne Twister per capire che cos'è, almeno a grandissime linee... tra l'altro in quella pagina c'è anche un'implementazione in pseudocodice che potrebbe essere tradotta in codice vero... con un po' di fatica, ma appunto a questo serve stimolare la curiosità intellettuale... a trovare piacere nel capire le cose facendo fatica.

Ma non solo. Siccome Wikipedia ha il grande vantaggio di procedere aristotelicamente per "genere sommo / differenza specifica", proprio in cima alla pagina del Marsenne Twister c'è scritto che il MT è un algoritmo della famiglia degli "pseudorandom number generator" (PRNG)  con tanto di link alla pagina relativa dove ti fa una bella panoramica più diffusa di questa famiglia di algoritmi. Molto spesso non troviamo le cose perché ci manca il termine da ricercare, ma appunto, Wikipedia in questo è utile. Adesso che abbiamo il termine giusto (PRNG) possiamo fare altre ricerche e toglierci altre curiosità intellettuali (sempre quelle).

Ma non solo. Proprio nella pagina panoramica sui PRNG, Wikipedia ti fa il favore di menzionare alcuni approcci specifici in una prospettiva storica. Questo è utile perché (ovviamente) i primi algoritmi sviluppati saranno anche i più facili da capire. Così magari puoi imbatterti, per esempio, nel classico "middle-square", che è facilissimo da implementare.

Ma non solo. Naturalmente (!) Wikipedia ha una pagina per il middle-square, e naturalmente (!) ci trovi persino... TA-DAAA! una bella implementazione già pronta, scritta nientemeno che TA-DAAA! in python, da copincollare con felicità.

Ora, voglio dire: questi sono tre-link-tre di wikipedia in fila...



Detto questo, io speravo invece che la tua curiosità intellettuale si sarebbe naturalmente indirizzata in un'altra direzione. Potresti (spontaneamente) porti la domanda filosofica: come faccio, nella vita reale, a estrarre un numero casuale? Tiro un dado, pesco da un'urna... insomma mi rivolgo a una "sorgente di casualità"... E un computer, lui, non avrà qualche "sorgente di casualità" a portata di mano che potrebbe essere utilizzata per estrarre un numero casuale?

Ovviamente puoi speculare a livello astratto su un po' di tentativi... per esempio, è (pseudo)casuale la media dei colori dei pixel dello schermo in un certo istante; è casuale il numero di millisecondi nell'ora esatta in cui poni la domanda; è casuale il tempo medio tra una pressione di tasto e la successiva nelle ultime cento pressioni sulla tastiera... fatti venire altri esempi... non fermarti finché non ne hai trovati almeno dieci... poi prova a metterli in ordine le "sorgenti di casualità" che hai trovato, e che sarebbero misurabili da un programma... mettile in ordine da quella che ti sembra la migliore (la più "casuale") alla peggiore. Potresti combinarle tra loro in vario modo, per aumentare la casualità... Uhm... vedi come la curiosità intellettuale comincia a ingranare? Ovviamente i primi tentativi che scriveresti in questo modo sarebbero dei *mediocri* generatori di numeri casuali, ma insomma... magari mica tanto mediocri.

Dopo un po' uno si stufa di procedere da solo e magari vuole vedere se altri hanno pensato cose analoghe (indovina: sì, certo che ci hanno pensato). Anche qui, con un po' di fatica, con un po' di tempo perso su google, uno finisce per trovare i termini giusti che gli mancavano. La "sorgente di casualità" si chiama "sorgente di entropia" in termine tecnico. E se provi la pagina "Entropy (computing)" di Wikipedia trovi una bella panoramica di come fanno i computer a estrarre entropia... con link e tutto. Molto interessante.



Oppure, certo: puoi sempre fare così: https://xkcd.com/221/

Offline PyPeppe

  • python unicellularis
  • *
  • Post: 20
  • Punti reputazione: 0
    • Mostra profilo
Re:Come generare numeri random
« Risposta #6 il: Maggio 22, 2020, 07:32 »
Interessante lettura.   :ok:

Offline Gianpatrizio

  • python unicellularis
  • *
  • Post: 17
  • Punti reputazione: 0
    • Mostra profilo
Re:Come generare numeri random
« Risposta #7 il: Maggio 22, 2020, 09:43 »
Sono pienamente concorde con PyPeppe, la sua lettura è stata veramente interessante. Proverò a fare come mi ha detto visualizzando anche le sorgenti indicate. Nel mentre, lascerò aperto questo forum e continuerò a scrivere quando, o come diceva RicPol mi sono stufato, oppure inoltrando la mia soluzione con altri utenti in modo tale da non fargli incontrare i miei stessi problemi.
Grazie mille per le risposte apprezzate veramente tanto
« Ultima modifica: Maggio 22, 2020, 09:54 da Gianpatrizio »