Newsgroup: it.scienza.informatica
Titolo: Funzione per numeri casuali

Mi servirebbe un funzione che calcoli dei numeri casuali in un certo
intervallo.
Al posto di usare le varie "random" o "rand" dei vari linguaggi di
programmazione, mi potete consigliare un modo per calcolare dei numeri
casuali ?
Non so.... io pensavo a qualcosa legato al clock del sistema in modo
che ad ogni ricalcolo della funzione si abbia la "quasi-certezza" che
il numero causale ottenuto scaturisca ogni volta da fattori variabili.
Ogni tipo di suggerimento che riteniate opportuno e' ben accetto.
Grazie in anticipo per gli eventuali aiuti.
Ciao.
MaX



Che io sappia il generetaore di numeri pseudo-casuali (quali il random o
rand) generano i numeri partendo proprio dal tempo di clock e alterandolo
tramite delle funzioni predefinite che danno particolari garanzie...(ad
esempio che stiano dentro un certo intervallo) daquesto il nome 
pseudo-casuali.. 
Quindi nella tua richiesta hai gia inserito la tua risposta :)


Grazie per i chiarimenti.
P.S. Se hai qualche altro suggerimento su come calcolare numeri
casuali senza utilizzare le funzioni predefinite dei linguaggi di
programmazione....

Nel pascal il seed (seme) per l'inizio dei numeri pseudocasulai e'
dato dal comando randomazie, il comando random genera il numero in
base al seed, quindi se vuoi numeri "piu' casulai" usa piu' volte
il comando randomazie.
Prog. per la generazione dei numeri casulai li trovi di solito assieme a quelli
criptografici, dai un occhio a 
http://FTP.NIC.FUNET.FI
 e vai nella sezione crypt
e poi onepad.
bye

randomazie ??  casulai ??
 hi hi hi     ma cos'e'?? ... ti ru ti ru ti ru ... una puntata de 'ai
confini della realta''??
.. poi a dare piu' randomise i numeri sono piu' casuali???
 ... mi sa che anche te bevi parecchio jack daniels!
allora io affermo che se do tanti print a schermo dopo un po mi stampa anche
sulle scarpe!

programmazione
E di un bel lancio di dadi che ne dici :-)
CMQ a parte gli scherzi, come li vuoi creare questi numeri
casuali? Con il computer o con cosa?
Sii piu' chiaro e qualcuno magari  sapra' darti
una risposta adeguata alle tue esigenze.
Se usi il computer (come presumo) puoi crearti
un algoritmo per i tuoi scopi con l 'Assembler,
ma e' un' po' come reinventare la ruota,
non ti pare? ;-)
Puoi cmq farlo, magari viene meglio.
E scriverla in codice binario?
Hemm.. auguri e buon lavoro. :-)
Ciao
Sandro


Niente di piu' facile, prova e vedrai che ci riesci! :-)
_____________________________________
Chiedo scusa a tutte le persone serie del NG ma
non sono riuscito a resistere :-D
CMQ ciao

  ... mi sa che anche te bevi parecchio jack daniels!
Mi spiace ma il jack daniels e' una merda, preferisco gli scozzesi.
bye

random dopo un certo numero di volte si ripetono.
Il "certo numero di volte" puo' essere reso arbitrariamente grande, e usando
come generatore le cifre di un dato numero irrazionale, anche infinito.
Solitamente si ripetono con un periodo sufficientemente lungo per qualunque
programma "normale". Il fatto e' che se hai esigenze particolari, generare
piu' volte il seme, non serve, anzi, puo' essere MOLTO controproducente. Se
ad esempio scrivi un programma del tipo:
1)prendi il seme dai millesimi di secondo dell'orologio di sistema
2)genera un numero pseudocasuale dal precedente seme e stampalo
3)torna al punto 1
Questo generera' sempre lo stesso numero per tutto un millesimo di secondo
(che per un programma e' tanto), quello successivo dipendera' dal millesimo
di secondo successivo... ed altro che casuale!
L'orologio di sistema, in conclusione, e' molto piu' prevedibile dei
generatori standard di numeri casuali, e se vuoi usarlo per rinfrescare il
seme di un'altro algoritmo... e' bene che questo rinfresco sia legato ad
eventi esterni, altrimenti addio...
PS: Se lavori col sistema operativo Linux, esiste uno speciale device
/dev/random, che genera caratteri casuali usando gli eventi di disco e
tastiera, piuttosto lentamente, quindi, ma in modo molto affidabile.



Siamo d'accordo... ma io sapevo che si scrive "RANDOMIZE" :-)))))))))
Ciauz, Gabry :-)
-- 
 _                        _   _
( )                      ( ) ( )   
http://poisson.dm.unipi.it/~stilli/
| |                      | |/ /
| |                      |   <
| |__                    | |\ \
(____)   I   G   H   T   (_) (_)   N   I   G   H   T

il comando randomazie.
Scusate, qualcuno sa l'equivalente in C?? :-)
Emanuele Cesena
d.a.m...@iol.it
           Attenti all'antispam NOSPAM
http://www.geocities.com/SiliconValley/Grid/8879
trovate ora l'editor per i livelli di Bubble2000!! :-))
ICQ n° #10570672

>Scusate, qualcuno sa l'equivalente in C?? :-)
  dipende ..
      visual c++,
         borland c++,
              c ++ builder,
                   TC++,
                  zortek c++,
              silicon c++ ,
            adfs c,
        adapte-C
     altro che standard.. hi hi hi .. sono quasi tutte diverse.
 comunque se guardi sotto RND RANDOM RAND RANDOMIZE SEEK nei rispettivi
help li trovi subito .. con le chiamate di rifermento trovi anche i comandi
collegati.

 qualunque programma "normale".
Il vero problema non e' la ripetizione: anche con 32 bit, che e' il
minimo usato, il periodo puo' essere oltre 4 miliardi, e non capita
spesso di dover generare cosi' tanti numeri.
Pero' un generatore pseudocasuale non studiato bene puo' avere altri
difetti: per es. correlazioni a periodo molto piu' breve.
Pero' a difesa dei gen. pseudocasuali va anche detto che in certi casi
e' molto utile che siano ripetibili, ripartendo con lo stesso seme.
Per es. in sede di debugging di un programma.
Se i risultati mi cambiano in modo casuale da una prova all'altra, e'
piu' difficile scovare un errore, capire l'effetto di una modifica.
-------------------
Elio Fabri
Dip. di Fisica
Universita' di Pisa

Scusate, qualcuno sa l'equivalente in C?? :-)
In ANSI C esistono queste funzioni :
ISO C Random Number Functions
-----------------------------
   This section describes the random number functions that are part of
   the ISO C standard.
 
   To use these facilities, you should include the header file
   `stdlib.h' in your program.
 
   - Macro: int RAND_MAX
       The value of this macro is an integer constant expression that
       represents the maximum possible value returned by the `rand'
       function.  In the GNU library, it is `037777777', which is the
       largest signed integer representable in 32 bits.  In other
       libraries, it may be as low as `32767'.
 
   - Function: int rand ()
       The `rand' function returns the next pseudo-random number in the
       series.  The value is in the range from `0' to `RAND_MAX'.
 
   - Function: void srand (unsigned int SEED)
       This function establishes SEED as the seed for a new series of
       pseudo-random numbers.  If you call `rand' before a seed has been
       established with `srand', it uses the value `1' as a default seed.
 
      To produce truly random numbers (not just pseudo-random), do `srand
      (time (0))'.
 
-- 
Warning!
Don't send any mail for me at my from: or replayto: addresses ;
I just kill the mail over there without reading!


Lo so, è che non trovo l'help del watcom :-)


Lo so, è che non trovo l'help del watcom :-)
  ..e' perche' prendi i programmi piratati!! hi hi hi
      .. come tutti del resto! anche quelli che dicono di no! ;-)))


Ecco: mi ero perso quest'ultimissimo passaggino :-)
Grazie mille!!


 collegati.
seek non c'entra. Molti hanno le altre funzioni, con nome minuscolo.
Ciao
Mauro Fiorentini

 Quindi nella tua richiesta hai gia inserito la tua risposta :)
Salve Max e Antonio.
I generatori pseudocasuali generano sequenze del tipo X(n+1) = F(X(n)).
Il primo numero puo' essere legato al clock, all'ora (solare), all'id del
processo, ma
di solito e' determinabile in modo semplice (in C e' un requisito), perche'
altrimenti
la ricerca degli errori sarebbe difficile: in fase di sviluppo, serve poter
ripetere
esattamente il comportamento di un programma.
Per quanto riguarda la funzione F, raccomando "The Art of computer
Programming"
di Knuth (II vol, mi sembra). Circa 150 pagine di sana (pesantissima) teoria.
In pratica si usano funzioni di questo tipo:
X(x+1) = (a * X(n) + c) mod m
"Generatore lineare conguente"
Semplici condizioni su a, c e m garantiscono che vengano generati tutti i
numeri da 0
a m - 1, prima di ripetere il ciclo.
Sfortunatamente, molti generatori usano una tecnica del genere, con m = 2^k.
Risultato ben noto (e catastrofico): i numeri generati mod 2^t (t < k) hanno
un
ciclo di lunghezza 2^t. In altre parole, sono pari e dispari alternati, i
loro resti mod 4
si ripetono dopo 4 numeri, mod 8 dopo 8 etc.
Meglio prendere m primo (grande), a dell'ordine della sua radice quadrata, c
< a.
Anche cosi' per un generatore di buona qualita' serve una scelta attenta di a
e c, ma e'
piu' facile.
Meno analizzati, i generatori quadratici: X(n+1) = (a * x(n)^2 + b * x(n) +
c) mod m.
Sono possibili polinomi superiori, ma non esiste teoria e i tempi di calcolo
si
allungano.
Un'alternativa sono i generatori "middle-square": si calcola X(n)^2 e si
prendono
le cifre centrali del quadrato (i bit centrali, in base 2). Oggi caduti in
disuso.
Per finire, segnalo tecniche (di solito implementate in h/w) basate su shift
a sinistra
dell'ultimo valore generato e somma dell'or esclusivo di alcuni suoi bit.
Naturalmente tutti questi generatori devono tenere in memoria l'ultimo numero
generato.
La maggior parte di quelli che si trovano nelle librerie Pascal, C, BASIC
etc. sono
da mediocri a scadenti (o peggio...). Per scopi appena seri conviene farselo,
copiando dalla bibliografia.
Nessuno usa direttamente il clock o altri "pezzi" dell'h/w: troppo grande il
rischio
che il ciclo che usa il generatore abbia un tempo di esecuzione multiplo
esatto del
clock (o in rapporto razionale semplice), generando sequenze che sono
progressioni aritmetiche o se ne scostano poco.
Per finire, ripeto la raccomandazione di Knuth:
"Per generare numeri casuali, la cosa peggiore e' procedere a caso!"
Aneddoto famoso.
Negli anni '50 un gruppo (forse con lo stesso Knuth) costrui' il "super
generatore":
defini' 10 funzioni F0 .. F9 come quelle che ho mostrato (ritenute allora tra
le migliori),
poi una "super funzione" del tipo:
Se X(n) mod 10 = 0, allora X(n + 1) = F0(X(n)).
Se X(n) mod 10 = 1, allora X(n + 1) = F1(F0(X(n))).
Se X(n) mod 10 = 2, allora X(n + 1) = F2(F1(F0(X(n)))).
...
Se X(n) mod 10 = 9, allora X(n + 1) = F9(F8(...F1(F0(X(n)))))))).
Fecero partire il generatore con un numero "a caso"....
e il generatore implacabilmente stampo' sempre lo stesso numero!
L'algoritmo definiva una funzione F(N) -> N, che aveva un punto fisso!
(e lo trovarono al primo colpo!)
Se serve qualche altra informazione, scrivetemi.
Mauro Fiorentini (
mfior...@etnoteam.it
)

...

No :-)
E' che non c'ho di spazio e non so se l'ho installato o no, ma comunque non
trovo nulla :)



Che però non va :-)


Poi e' vero che i vari Borland, Microsoft etc, definiscono anche altre
funzioni
 che pero' ..
(che i programmatori seri si guardano bene dall'utilizzare)
..e perche'???
  io che le uso in quanto forniscono dei risultati decisamente migliori di
quelli dello standard portabile sono un programmatore che fa ridere? ;-) hi
hi hi   .. insomma..
  .. dimmi il massimo del programma SERIO per te  ... e il programma piu'
SERIO che hai fatto
  che facciamo un confronto con quelli che ho fatto io .. poi discutiamo ..
DOPO.
  .. tutto deve essere DIMOSTRABILE ovviamente!.. verba volant.

   .. tutto deve essere DIMOSTRABILE ovviamente!.. verba volant.
Serio come questo ? (scusate la digressione :) )
int a[1817]; main(z,p,q,r) { 
  for(p=80;q+p-80;p-=2*a[p]) 
    for(z=9;z--;) 
      q=3&(r=time(0)+r*57)/7, 
	q=q?q-1?q-2?1-p%79?-1:0:p%79-77?1:0:p<1659?79:0:p>158?-79:0,q?!
	a[p+q*2]?a[p+=a[p+=q]=q]=q:0:0; 
  for(;q++-1817;) 
    printf(q%79?"%c":"%c\n"," #"[!a[q-1]]); } 
provare per credere,
-- 
		    /\ I am just an optimizator  \/
		    /\ ------------------------  \/
		    /\  Giorgio Vecchiocattivi   \/

   .. tutto deve essere DIMOSTRABILE ovviamente!.. verba volant.
Il massimo programma SERIO che ho visto: ho pochi dubbi: rogue, nella versione
originale di M. Toy: uno splendido esempio di chiarezza. Un gioco stile
"dungeon",
che la grafica odierna ha reso obsoleto, ma che considero sempre uno splendido
esempio. Yacc (l'originale), il sistema operativo "THE" e Tex non sono certo da
buttar via.
Per il codice mio, non ho nessun interesse a impegnarmi in stupide polemiche,
ma soprattutto non' ho il tempo di scartabellare i mei archivi (a ordinamento
casuale),
comunque ti lascio scegliere tra:
5 Compilatori (Pascal, C e FORTRAN 2 volte),
1 sistema operativo real time per 4 architetture diverse,
1 debugger,
4 generatori di codice (S6000, ARM, Hyperstone, Z8000),
un simulatore di architetture Intel.
Ma restando sul codice puramente numerico:
tutte le librerie aritmetiche di L1 e L2 Olivetti, per COBOL, BASIC, FORTRAN,
C e Pascal,
le librerie numeriche del thetered (quello si', che ha fatto ridere!)
qualcosa per l'EFA,
una libreria aritmetica a 18 cifre per ENEL.
Vero, quasi tutto software di base, non applicazioni,  per questo insisto sulla
portabilita', perche' le applicazioni end-user, per vari motivi, tendono a
essere
molto piu' dipendenti dalla piattaforma (h/w + OS), quindi ci si preoccupa meno
della portabilita', soprattutto se si lavora per piattaforme Intel + Windows.
Su Unix, invece, dovendo di necessita' prevedere porting su macchine
differenti,
si sta molto piu' attenti, nell'industria almeno: l'universita' ha stile
diverso,
ma anche esigenze diverse.
Parlando di applicazioni, se capiti in Israele o in alcuni paesi sudamericani,
dai un'occhiata ai ghirigori anti-falsificazione sulle banconote e chiediti
come
sono fatti. Non un grande esempio, quasi un fallimento, perche' alla fine quel
programma gira solo su macchine Intel (costano meno) ma era pensato per
funzionare dovunque.
Per il resto (credo avanzino altre 200000 righe di codice) e per vedere i
relativi contratti,
vieni a trovarmi.
Ma torniamo al s/w SERIO, che puo' interessare chi legge il nsgroup di
matematica.
Scrivo un post separato, dal titolo "mattone razionale". Su quello puo' valere
la pena
confrontarsi, perche' se non altro si offre ai matematici qualche bit di
informazione
aggiuntiva.
Chiedo scusa a tutti per la lunghezza (e la scarsa utilita') di questa
risposta.
Mauro Fiorentini

funzionare dovunque.
 Non ti rispondo piu' a niente perche in base a questa affermazione posso
dire con ragion di causa che sei un contapalle.
 E non intendo confrontarmi con te sulla base delle tue frottole.

 wrote:
Grazie mille per l'interessante lezione di teoria sui numeri casuali.
Provero' io a fare la pratica....... Speriamo Bene!!!!!!!! :-)
Ciao.
MaX

In it.scienza.informatica Master ha scritto:
M>   ..e' perche' prendi i programmi piratati!! hi hi hi
M> 
M>       .. come tutti del resto! anche quelli che dicono di no! ;-)))
eheheh....
poveri voi utenti di software commerciale... :-))
Ciao
Marco
-- 
Se vale la pena di farlo, ne valeva la pena ieri. (Dilemma di Grossman)

  E non intendo confrontarmi con te sulla base delle tue frottole.
Paura o scelta? Diciamo che hai scelto un esempio.
Chiedi a:
ASTRO SERVICE (srl)
20060 Colturano (MI) - 6, v. delle Industrie
tel: 0298237460
Chi ha scritto il programma della guilloche.
Poi alla Epikos, di Lugano, da chi ha acquistato la guilloche meccanica, poi
alla:
EMILIO DI MAURO (spa)
20139 Milano (MI) - 19/a, v. Marco D’Agrate
tel: 0257301182, 0257301346, 0257400132
Con che macchina creano i disegni.
Poi devi rivolgerti alla zecca di Israele, ma non ti risponderanno.
Oppure fai causa all'Universita' di Milano, per aver riportato all'indirizzo
http://www.crema.unimi.it/didattica/programmazionelab.html
un curriculum fasullo.
Beh, fasullo no, pero' fa un po' schifo ed e' incompleto, ma loro non sono
perseguibili per questo: aggiornarlo sarebbe compito mio.
La mia affermazione forse va precisata: nessun programmatore serio usa una
funzione non standard e quindi non portabile, "se puo' farne a meno".
la condizione "se puo' farne a meno" era per me ovvia, ma i matematici sono
abituati
al rigore estremo e quindi aggiungiamolo.
A volte e' impossibile evitare l'uso di funzioni non standard, e allora
pazienza,
ma dove esiste un'alternativa standard, non utilizzarla non e' sbagliato,
irresponsabile,
punibile, sconsigliabile, sbadato, antiestetico ecc.
E' semplicemente "costoso" in termini industriali.
Mauro Fiorentini

Oh Mauro!! e s'e' capito da mo' che sei tutto te e ora diobonino dacci un taglio e
adeguati al topic del newsgroup, grazie..e un se ne pole piu' de' numeri
'asuali.. e fatevi causa, du' picchi e chi sta' ritto ha vinto, suvvia..
Cheers
Yuri
PS A little bit of humor gives life a better taste

i loro resti mod 4 si ripetono dopo 4 numeri, mod 8 dopo 8 etc.
Inoltre succede un'altra cosa che mi sembra interessante: anche se il
periodo 2^t di uno di questi cicli e' lunghissimo (mettiamo t=256), il
logaritmo discreto in base 2^t e' computabile in modo estremamente
efficiente (complessita' dell'ordine di t), a differenza del logaritmo
discreto in base generica. Conseguenza: dato un numero qualsiasi x e
noti 2 numeri qualsiasi generati consecutivamente, si e' in grado di
prevedere praticamente *quando* x verra' generato. Ciao

esempio
Ehi! Per fortuna c'è qualcuno su Usenet che ha del buon gusto!!! ;-)
Scherzi a parte concordo sul fatto che sia un gran  bel programma (o gioco).
Ciao Dade
Davide Mastromatteo :
Mastrosoft    ---> 
www.bigfoot.com/~mastrosoft
Contattateci ---> 
mastr...@bigfoot.com
ICQ: 21746800
***I'll be your friend, I'll be around, I'll be everithing you need***

 PS A little bit of humor gives life a better taste
PPS
Don't take life so seriously: it's just a temporary situation.
Mauro Fiorentini