Newsgroup: it.comp.lang.c
Titolo: Aiuto per la scuola!!!

Ciao a tutti...l'ultima lezione di informatica ha avuto come ordine del
giorno una diatriba sul random....la funzione del C random è pseudo casuale,
pero' c'è la funzione randomize che dovrebbe "aumentare la casualita'" se
non erro...
La prof aveva chiesto a noi di fare un programmino che simuli il lancio di
un dado...
io sono andato sul classico e ho usato random e randomize...mentre un mio
amico ha presentato un programma che consisteva in un ciclo for che va da 1
a 6 ripetuto infinite volte finchè l'utente non schiaccia un tasto.
Secondo me un programma del genere non da' un numero strettamente casuale in
quanto ripete sempre la sequenza 1-6, e poi il fatto che l'utente stoppi il
lancio virtuale pregiudica la casualita'...almeno cosi' credo!
Per questo vorrei chiedervi che ne pensate, e se conoscete un algoritmo che
generei dei numeri casuali, o magari l'algoritmo della funzione random!
Grazie a tutti in anticipo!
--
 Byez By Roby "Offear" '82
 Visit my personal Home-Page:
 
http://surf.to/HPOffear
 And Sign My Guestbook!

 lancio virtuale pregiudica la casualita'...almeno cosi' credo!
Mah, secondo me e' MOLTO casuale, nel senso che l'utente non puo' sapere
in che punto il ciclo verra' interrotto. Vista l'applicazione penso che
vada piu' che bene.
Ciao, Luca.
-- 
 Reply to 
luca....@tiscalinet.it
 UIN : 43385135

 generei dei numeri casuali, o magari l'algoritmo della funzione random!
I numeri generabili da un algoritmo sono sempre pseudo-casuali. Però ci
sono algoritmi peggiori e algoritmi migliori.
EMG

you wrote :
#Ciao a tutti...l'ultima lezione di informatica ha avuto come ordine del
#giorno una diatriba sul random....la funzione del C random è pseudo casuale,
#pero' c'è la funzione randomize che dovrebbe "aumentare la casualita'" se
#non erro...
In C non esiste una funzione "random" ne' "randomize", ma
probabilmente ti stai riferendo a "rand()" e "srand()".
La funzione di srand() non e' quella di *aumentare* la casualita' dei
numeri, che sono comunque pseudo-casuali, in quanto comunque *legati*
tra loro, ma quella di inizializzare la sequenza con una matrice di
generazione dei numeri casuale.
#La prof aveva chiesto a noi di fare un programmino che simuli il lancio di
#un dado...
#io sono andato sul classico e ho usato random e randomize...mentre un mio
#amico ha presentato un programma che consisteva in un ciclo for che va da 1
#a 6 ripetuto infinite volte finchè l'utente non schiaccia un tasto.
#Secondo me un programma del genere non da' un numero strettamente casuale in
#quanto ripete sempre la sequenza 1-6, e poi il fatto che l'utente stoppi il
#lancio virtuale pregiudica la casualita'...almeno cosi' credo!
Un programma del genere non va bene, in quanto supponendo di riuscire
ad intervallare uno stop e l'altro con un tempo costante, i numeri
ottenuti sarebbero sempre gli stessi.
#Per questo vorrei chiedervi che ne pensate, e se conoscete un algoritmo che
#generei dei numeri casuali, o magari l'algoritmo della funzione random!
Nelle FAQ di comp.lang.c credo ci sia un algoritmo del genere.
--------------------------------------------------------
* Andrea Laforgia        (
andrea_...@bigfoot.com
) *
--------------------------------------------------------

you wrote :
#Mah, secondo me e' MOLTO casuale
Hmmm... secondo me no.
Dipende comunque dalla velocita' del programma.
In linea di principio ritengo che una generazione del genere non sia
affatto casuale.


 ottenuti sarebbero sempre gli stessi.
[...]
Su questo posso essere d'accordo, ma in una applicazione in cui e'
l'utente a interrompere il ciclo con la pressione di un tasto, non si
riuscirebbe ad avere una sequenza di numeri uguali neanche volendo,
anche perche' la velocita' di esecuzione del ciclo potrebbe anche
variare.
Luca


you wrote :
#Su questo posso essere d'accordo, ma in una applicazione in cui e'
#l'utente a interrompere il ciclo con la pressione di un tasto, non si
#riuscirebbe ad avere una sequenza di numeri uguali neanche volendo,
#anche perche' la velocita' di esecuzione del ciclo potrebbe anche
#variare.
Che la velocita' di esecuzione del ciclo cambi lo ritengo improbabile,
in quanto al non ottenere una sequenza di numeri uguali potrei essere
d'accordo, se non fosse che comunque i numeri generati intervallando
la pressione del tasto di, 
ad.es
. 5 secondi, cadrebbero tutti in un
certo range.


 certo range.
Beh, non conti gli Interrupt.
E comunque un ciclo che incrementa una variabile e controlla la pressione di
un tasto fa un "giro" completo in circa:
supponiamo 100 istruzioni linguaggio macchina
supponiamo 200 Mh
supponiamo 1 pipeline
=>tempo per ciclo completo: 100 / 200'000'000 = 0.5 E6
=>mezzo milionesimo di secondo
Trovo difficile essere cosě precisi premendo un tasto. Per cadere sempre in
un certo range bisognerebbe anche essere ancora piů precisi.
Oppure ho sbagliato qualcosa?
--
Alessandro Monti

 affatto casuale.
Secondo me, potrebbe anche andare bene.
Tutto dipende dalle applicazioni dell'algoritmo.
Se si deve programmare un videogioco, questo, non sarebbe di certo il metodo
migliore...
--
Fabio "C h R o N o" "Engraver"
UIN: 47413913
E-mail: 
fab...@puntofuturo.net
Homepage: 
http://digilander.iol.it/Emima/
"E il maestro disse Kung. E Kung fu."

 Oppure ho sbagliato qualcosa?
Anche a me sembra sia così.
EMG

 certo range.
Si parlava di numeri da 1 a 6, piu' range di cosi' si muore ;-)
Ciao, Luca.


#Trovo difficile essere così precisi premendo un tasto. Per cadere sempre in
#un certo range bisognerebbe anche essere ancora più precisi.
Quello che voglio dire e' che se l'intervallo fosse del tipo :
123456123456123456123456
 !-----------------!
      5 secondi
potrei premere un tasto ogni 5 secondi dopo l'apparire del 2 ed
ottenere sempre un valore compreso nel range 1..3 per esempio,
contando qualche centesimo di errore.
E comunque l'algoritmo a mio avviso non va bene perche' non
ricostruisce il caso reale in cui non c'e' un dado che ruota e che
viene bloccato manualmente.
La prova che cio' che dico e' probabilmente vero ce l'hai dal seguente
programma, il quale testato sulla mia macchina (un pentium 166 con
djgpp) offre il seguente output, premendo un tasto ogni 5 secondi
(piu' o meno) :
2 4 4 4 6 4 2 2 6 4 5 4 4
Come si puo' vedere, i valori, tutt'altro che casuali, cadono per la
maggior parte nel range 4..6
#include <stdio.h>
#include <conio.h>
main()
{
    int i = 1, c = 0 ;
    while ( c != 27 )
    {
          if ( kbhit() )
          {
             c = getch() ;
             printf("%c ", '0' + i ) ;
          }
          if ( ++i == 7 ) i = 0 ;
    }
    return 0 ;


you wrote :
#Cosa ci sarebbe di strano? Con altre applicazioni in esecuzione, sarebbe
#praticamente impossibile mantenere constante il tempo del ciclo; ammetto
#pero' che se stiamo parlando di un programma DOS (non la finestrella di
#Win), allora la mia affermazione non e' piu' valida, ma anche in quel
#caso penso che si avrebbero cmq delle oscillazioni.
A parte il fatto che tu parli di rallentamento, che renderebbe il
codice ancor meno affidabile, poi quando si studiano i tempi di un
algoritmo si prescinde dall'esecuzione in un determinato ambiente.
#Si parlava di numeri da 1 a 6, piu' range di cosi' si muore ;-)
Non hai compreso cosa volessi dire (vedi altro messaggio).


 2 4 4 4 6 4 2 2 6 4 5 4 4
E allora? Sono nel range [2-6], quale sarebbe il sub-range che dicevi? Ti
preoccupa che non sia mai uscito l'uno?
prova anche a contare quante volte la variabile viene azzerata nei tuoi 5
secondi, poi dimmi se ti sembra cosě facile beccare lo stesso numero, anche
cronometro alla mano.
E anche se avessi un cronometro cosě preciso, ci sono sempre gli interrupt
che mettono un po' di casualitŕ, ergo l'algoritmo non mi sembra da buttare
per un caso cosě semplice.

 
Praticamente e' lo stesso tipo di risultato che si ottiene con un
rand()%6 + 1 ; su intervalli abbastanza grandi, la casualita' e'
accettabile ma, su range cosi' ristretti lascia un po' a desiderare. Cmq
e' ovvio che su un campione di output piccolo ci sia, su range
ristretti, un valore predominante, la casualita' va apprezzata su output
piu' lunghi dove ha senso fare una media dei valori.
-- 
 Ciao, Luca.
