Autore Topic: Rnd Poco Casuale  (Letto 2365 volte)

Cbm

  • Utente
  • **
  • Post: 423
  • Gioco Preferito: Wonderboy
Rnd Poco Casuale
« il: 26 Ottobre 2008, 14:21:12 »
 Non sto qui a tediarvi col perchè, ma avevo bisogno di stampare delle pagine ricoperte di numeri in maniera casuale, e piuttosto che iniziare a digitare a caso ogni volta, ho pensato di usare allo scopo il 64.

Per ottenere una vera casualità, ho fatto iniziare il tutto con un bel RND(-TI), pena il ripetersi dell'identico ciclo di numeri ad ogni lancio della routine.
Scopo raggiunto e tutto a posto per quel che dovevo fare.

Perchè scrivo allora? Semplice riacutizzarsi di una curiosità avuta, ma senza mai occasione di essere soddisfatta.

Per esempio. Su ccc, propinarono già sul primo numero, il programmino semplice semplice per simulare il lancio dei dadi. Anche tenendo conto del fatto che con ogni probabilità lo scopo di quell'articolo fu didattico e non certo mirato veramente al proporre una sostituzione fisica dei dadi fisici per una giocata a monopoli, mi appare a prima vista come una grossolana svista; per il fatto che utilizzando la funzione RND dura e pura così come proposta, ad ogni lancio di quella routine, gli eventuali sprovveduti avventuratisi a giocare a monopoli con l'ausilio del loro "minuscolo" dadocomputer sul tavolo, si ritrovarono ogni volta con partite identiche.
Suonandomi strano, anche per l'intenzione didattica di quell'articolo, che non ci sia riferimento alcuno al fatto che una vera casualità cercata in quel modo in realtà non si ottiene, mi chiedo e Vi chiedo se effettivamente non ci sia tecnicamente qualcosa che mi sfugga in tutto ciò; anche perchè anche in altre occasioni, e, persino sul manuale del 64 (nei soli esempi), ci sono esempi dell'uso di RND per generare eventi casuali, senza riferimento al fatto che ad ogni reset del computer, gli eventi ottenuti saranno identici ogni volta.

Buona domenica.
 
C= - Dal 1985! Lunga vita e prosperità.

Roberto

  • Administrator
  • Utente
  • *****
  • Post: 2418
    • https://ready64.org
  • Gioco Preferito: Impossible Mission
Rnd Poco Casuale
« Risposta #1 il: 26 Ottobre 2008, 14:35:49 »
 Ciò che tu descrivi avviene soltanto in emulazione.

Se fai doppio click su un file .PRG o trascini lo stesso nella finestra di emulazione, non fai altro che resettare la macchina e _contemporaneamente_ avviare il programma.

Invece, nella realtà, il tempo che trascorre dal momento in cui accendi il Commodore 64 al momento in cui esegui il programma è sempre diverso, basta una frazione di secondo in più o in meno nel digitare i comandi per il caricamento e per dare il RUN, per intenderci.
Per collaborare, segnalare un errore (o qualsiasi altra comunicazione importante) utilizzare la pagina dei contatti:
https://ready64.org/informazioni/contatti.php

Cbm

  • Utente
  • **
  • Post: 423
  • Gioco Preferito: Wonderboy
Rnd Poco Casuale
« Risposta #2 il: 27 Ottobre 2008, 13:10:05 »
 Grazie della tua risposta Roberto. Che la cosa fosse colpa dell'emulatore (ccs64) è una delle prime cose che avevo pensato quando mi sono accorto che le sequenze si ripetevano immutate.
Poi però la teoria ha vacillato in me. Sia per le prove fatte con esito negativo, sia perchè ho pensato che se fosse stato colpa dell'emulatore, anche qualche programma avrebbe risentito di questo effetto col risultato di ripetersi ad ogni avvio.
Ora tu mi dai una conferma di quanto inizialmente pensato; a non farmi convincere di ciò serenamente, rimane però questo ulteriore dubbio.
In base alle varie prove che ho fatto nei giorni scorsi, l'effetto viene fuori anche se, ad emulatore acceso, batto direttamente, seguito da invio, qualcosa come
Codice: [Seleziona]
print int(rnd(1)*6)+1, a simulare il classico lancio di dadi.
Ecco, facendo per esempio sei tentativi ad ogni "accensione" del ccs64, la sequenza dei lanci sarà sempre di: 2, 1, 5, 4, 6, 4
Facendo così l'orologio di sistema dovrebbe non resettarsi, anche se in emulazione. O mi sbaglio?
C= - Dal 1985! Lunga vita e prosperità.

Roberto

  • Administrator
  • Utente
  • *****
  • Post: 2418
    • https://ready64.org
  • Gioco Preferito: Impossible Mission
Rnd Poco Casuale
« Risposta #3 il: 27 Ottobre 2008, 13:31:17 »
 Nel primo esempio però generi un numero basato sul tempo (-TI), nel secondo esempio no.

Ad ogni modo la causalità assoluta in informatica non può esistere perchè un numero viene per forza di cosa estratto in base ad un criterio matematico che per quanto complesso ha sempre delle sue regole predefinite.

Ci sono tecniche più elaborate per introdurre maggiore aleatorietà nella generazione dei numeri casuali, per esempio utilizzando il SID.
Se qualcuno con conoscenze più specifiche delle mie vuole, può espandare il discorso anche se giurerei se ne fosse già parlato in passato sul forum (ma non ritrovo il thread).
Per collaborare, segnalare un errore (o qualsiasi altra comunicazione importante) utilizzare la pagina dei contatti:
https://ready64.org/informazioni/contatti.php

Cbm

  • Utente
  • **
  • Post: 423
  • Gioco Preferito: Wonderboy
Rnd Poco Casuale
« Risposta #4 il: 27 Ottobre 2008, 14:28:06 »
 
Citazione da: "Roberto"
anche se giurerei se ne fosse già parlato in passato sul forum (ma non ritrovo il thread).
L'argomento, compreso il punto della casualità relativa, lo aveva toccato un articolo sullo stesso CCC, ma non sono riuscito neanche più a ritrovarlo.

Riguardo l'uso di TI, solo con quello riesco a generare risultati diversi ogni volta che lancio RND.
C= - Dal 1985! Lunga vita e prosperità.

eregil

  • Administrator
  • Utente
  • *****
  • Post: 706
  • Gioco Preferito: Impossible Mission
Rnd Poco Casuale
« Risposta #5 il: 27 Ottobre 2008, 17:47:21 »
 Tieni presente che il manuale d'uso del C64 contiene un'inesattezza riguardo la funzione RND.

Secondo il manuale, RND(0) restituisce l'ultimo numero casuale generato precedentemente; in pratica, stando a quanto dice il manuale, il piccolo programma:

Codice: [Seleziona]
10 X=RND(-TI)
20 A=RND(1)
30 B=RND(0)
40 IF A=B THEN PRINT "UGUALE"

dovrebbe sempre stampare "UGUALE".

In effetti, in alcuni BASIC, RND(0) ha questo effetto; non nel BASIC 2.0 del C64, però.

Il reale significato del parametro è invece il seguente:

minore di 0 - inizializza il seed (seme) del generatore di numeri pseudocasuali.

maggiore di 0 (qualsiasi) - restituisce il numero successivo della sequenza di numeri pseudocasuali.

Come si è fatto notare, la sequenza sarà sempre uguale se si inizializza il seed con lo stesso parametro (negativo), e per ottenere un discreto grado di "casualità" è necessario ricorrere a RND(-TI), ma anche questo si rivela insufficiente se RND(-TI) è eseguito sempre nello stesso istante a causa del ricorso all'emulazione (o anche a una cartuccia freeze nel C64 vero).

0 - calcola un numero pseudocasuale sulla base dell'orologio. Il numero pseudocasuale è indipendente dalla sequenza di numeri pseudocasuali.

Essendo basati sempre sull'orologio, i numeri generati da RND(0) si rivelano ragionevolmente "casuali", in particolare, quando le chiamate a RND(0) sono inframmezzate da pause dipendenti dall'input dell'utente. La diversa durata dell'attesa della pressione di un tasto o dell'inserimento di un comando fungerà praticamente da "reinizializzazione" ogni volta che si genera un numero casuale con RND(0).

Nota che con questo non intendo dire che RND(0) sia automaticamente migliore del classico ricorso a RND(-TI) seguito dall'uso di RND(1); solo che è una alternativa che si può tenere presente, con la premessa di cui sopra.
 
Non rispondo a richieste private, di qualunque genere esse siano.
Per domande tecniche leggete le FAQ e usate l'apposito forum.
Per questioni amministrative contattate lo staff tramite il form Contatti sul sito.