Devo generare una sequenza di numeri in modo casuale da 1 a 10 ma senza che
questi vengano ripetuti.
Vorrei utilizzare una sola variabile che cambia valore (da 1 a 10) dopo
averla utilizzata.
Qualche consiglio?
Grazie. Ciao.
Andrea.
VB o VB.Net?
.m
--
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com
blog @ http://milestone.topics.it
whynot [ at ] topics [ dot ] it
Istruzioni RANDOMIZE e RAND
crei un array di 10 elementi e li setti a 0
fai uscire il primo numero e setti l'elemento
dell'array del numero uscito a 1.
Fai uscire gli altri numeri e se l'elemento del'array
e a 0 accetti il numero casuale
Utilizzo la versione espress 2010
Ciao.
Penso di aver capito. Forse.
Ma in questo modo, non potrei avere due elementi con lo stesso numero? In
che modo verifico che il numero non sia gia' uscito?
Ciao.
You wrote on 29/08/2010 :
> Utilizzo la versione espress 2010
dai un okkio a System.Random
> Ciao.
Fai un
Dim controllo(10) as integer
dim flag,numero as integer
flag=0
do
Randomize()
numero = Format(Int((10) * Rnd()), "00") ' numero a caso
if controllo(numero)=0 then
controllo(numero)=1
flag=flag+1
end if
if flag = 10 then exit loop ' se sono usciti tutti e 10 esce
loop
Questo forse è sbagliato !
numero = Format(Int((10) * Rnd()), "00") ' numero a caso
cosi' dovrebbe andare
numero = Int((10) * Rnd()
> Utilizzo la versione espress 2010
Puoi fare una cosa tipo:
Dim usciti As New List(Of Integer)
Dim cas As New Random
Do Until usciti.Count = 10
Dim n As Integer = cas.Next(1, 11)
If usciti.IndexOf(n) = -1 Then
usciti.Add(n)
End If
Loop
in questo modo nella lista "usciti" ti rovi la sequenza di numeri estratti.
Se ad esempio vuoi visualizzarli in un RichTextBox:
For Each num As Integer In usciti
RichTextBox1.AppendText(Environment.NewLine & num)
Next
Controlla che sia corretto, perché l'ho scritto di getto.
--
news:it-alt.comp.software.openoffice : Il newsgroup dedicato a
OpenOffice.org, la suite open source di applicazioni per ufficio.
Scarica "OpenOffice.org 3: Soluzioni a raccolta", molto più di semplici
FAQ! http://it.openoffice.org/doc/manuali/
Va stra-bene!
Come ho scritto non sono una cima in vb, mi puoi spiegare in parole umane
che cosa fa la procedura?
Grazie. Ciao.
Andrea.
> Dim usciti As New List(Of Integer)
' Crea una lista di interi, che conterrà i numeri casuali generati
>> Dim cas As New Random
' Crea un oggetto della classe Random, che genera numeri casuali
>> Do Until usciti.Count = 10
' Esegue il ciclo fino a quando la lista non contiene 10 elementi
>> Dim n As Integer = cas.Next(1, 11)
' Crea una variabile intera e gli assegna un numero casuale da 1 a 10
generato dell'oggetto Random.
>> If usciti.IndexOf(n) = -1 Then
' Controlla che il numero casuale generato non sia già presente nella lista
>> usciti.Add(n)
' Se non è presente lo aggiunge
>> End If
>> Loop
Fine del ciclo. Lo ripete fino a quando le condizione (10 elementi) non
è verificata
Solo che non sempre la risposta "operativa" coincide con la risposta
matematica!
Ovvio che te ne può non fregare nulla ed usare una versione
"operativa".
Se vuoi fare una cosa matematica ti scontri con 2 (DUE) problemi:
1) Del pc: i numeri random sono (nei lingauggi standard) PSEUDO-
casuali.C'è un algoritmo che nelle MEDESIME condizioni ti propone i
soliti risultati. Vieppiù: i risultati sono una sequenza grande ma
LIMITATA e RICONOSCIBILE dei numeri rappresentabili.
Quindi va benissimo per simulare il collegamento di client, per la
scopa, la briscola, MENO per calcoli statistici.
Soluzioni attualmente possibili? SW NESSUNA!!! HW una soltanto: esiste
un generatore che utilizza un fotone ed un effetto quantico per cui se
conosci lo spin non conosci la posizione del fotone e viceversa: lo
comnmercializza una ditta americano e non costa neppure tanto....solo
che ho perso il link e non te lo posso fornire! Allo stato delle
tecnologia attuale è l'unico sistema per avere una sequenza di bit
davvero casuale.
2) Un limite dell'algoritmo:
tu vuoi una sequenza di 10 numeri! COME LA VUOI?
Indipendentemente dalle estrazioni...va bene TUTTO quello che ti hanno
detto!
MA
vuoi simulare il lotto? NON VA BENE UN CAZ...ops...NULLA!
Ragiona:
1 tentativo) 90 numeri in un sacco...estrazione random....1 numero
estratto
2 tentativo? 90 numeri in un sacco? NO! 89 in un sacco!!!! se lo fai
su 90 numeri e vuoi calcolare qualcosa di statistico sballa tutto!
Ho fatto a suo tempo un algoritmo che teneva conto di ciò e non è
affatto semplice!
in sintesi:
1)prendi una matrice e riempila random di numeri
2)estrai un numero fra limite min e limite max della matrice
3)cancella il numero dalla matrice e fanne una nuova UGUALE SENZA IL
BUCO del numero estratto
4) ritorna al punto 2 e loop per quanti numeri vuoi estrarre
Vedrai che alla prima estrazione estrai un numero fra 90 numeri poi
fra 89 poi fra 88 e così via...come se fosse il sacco della tombola!
Ovvio che questa cosa(o una cosa simile) la fai solo se sei
interessato ad alcuni tipi di simulazioni (ad esempio super enalotto
per andare sul volgare!) o ad alcune figure statistiche!
In sintesi: avere una sequenza di 10 numeri con 100 tentativi e
diverso assai che averla con 10 tentativi! Sballa tutto in alcuni
ambiti!
Tanto per far riflettere che spesso si usano cose che son più
complesse di un apparentemente semplice System.Rand !!!
> In sintesi: avere una sequenza di 10 numeri con 100 tentativi e
> diverso assai che averla con 10 tentativi!
Ma alla fine cosa cambia? Se hai un certo numero si sequenze di 10
numeri differenti sei in grado di capire quali sono state generate con
un metodo e quali con un altro? Anche solo di dare una probabilità
diversa dal 50%?
Se esiste un qualsiasi metodo matematico/statistico che ti permette di
riconoscerle (anche con approssimazione) va bene quello che dici tu,
mentre se non esiste è inutile simulare "il sacchetto della tombola".
Esiste? :-)
Se vogliamo volgarizzare
se usiamo una tombola ogni estrazione è un "mondo a sè"...con un mondo
in divenire...90----89---88---87 e così via
Se te sprechi 3 tentativi per fare l'88 colpo sprechi 3 "mondi"...non
è la solita cosa! Anche filosoficamente!
Non sono un matematico e non le ricordo...ma feci una discussione
tanto tempo fà con un matematico e esistono formule matematiche che
tengono conto di cio che impropriamente esprimo!
> Non sono un matematico e non le ricordo...ma feci una discussione
> tanto tempo fà con un matematico e esistono formule matematiche che
> tengono conto di cio che impropriamente esprimo!
Mi piacerebbe saperne di più su queste formule...
Il mio ragionamento è semplice. Ammettiamo che io ho 100 sequenze di 10
numeri, e so a priori che sono state ottenute con due metodi diversi.
50 sequenze sono state ottenute col "metodo della tombola", mentre le
altre 50 sono state ottenute pescando ogni volta tra tutti i numeri
disponibili e poi scartando quelli già usciti.
Esiste un sistema matematico qualsiasi che mi permetta di dividere le
serie in due gruppi di 50 e dire una cosa tipo: ogni serie del primo
gruppo ha una probabilità del 51% di essere stata generata col metodo
della tombola.
Se una cosa del genere si può fare (diciamo se c'è un teorema con
relativa dimostrazione che dice di sì) allora ha senso quello che dici,
altrimenti non ha senso.
Visto che io sono un chimico e non un matematico, non lo so... se devo
andare a logica e istinto io direi che non di può fare, ma magari
sbaglio clamorosamente :-)
We :)
Credo che Wodka voglia intendere che la casualità del generatore interno
è predefinita e limitata. Questo è un ossimoro perché un generatore di
sequenze numeriche che ripeta i propri schemi non si può definire
casuale: la funzione di randomizzazione ha n combinazioni ed alla n+1
generazione gli schemi si ripetono.
Anche con pochi numeri la probabilità di incorrere in schemi già
utilizzati è alta. I simulatori di giochi, per quanto perfetti, non
riescono ad ottenere risultati statistici di distribuzione che si
avvicinino a quelli reali.
Se nel caso del solitario di uindos la cosa è ininfluente, in altri
campi applicativi questo può rappresentare un problema.
Ciao cia`
--
-> GbC|
www.gbcdepot.com
www.chiappori.com
> http://it.wikipedia.org/wiki/Disposizione
Va bene, posso sapere quante sono le disposizioni possibili di k
elementi estratti da un gruppo di n, questo è chiaro. Qui però nulla mi
dice sul come sono state ottenute queste disposizioni, e ogni
disposizione ha esattamente la stessa probabilità di tutte le altre.
> Credo che Wodka voglia intendere che la casualità del generatore interno
> è predefinita e limitata.
Questo lo ha dello nel punto 1, e sono perfettamente d'accordo con lui.
Io però stavo discutendo il punto 2 :-)
> Io però stavo discutendo il punto 2
Cioè, mi sembrava di essere stato chiaro su quale è il punto, ma
probabilmente non lo sono stato.
Wodka40 dice che non è la stessa cosa ottenere le sequenze con un metodo
o con un altro. Io dico: se ti do delle sequenze, tu riesci a capire
quali sono state prodotte con un metodo e quali con l'altro? Se ci
riesci non è la stessa cosa, se non ci riesci è la stessa cosa e
l'algoritmo che le ha generate è ininfluente :-)
A me non sembra affatto!
se per ottenere 3 27 44 io lancio 3 volte l'algoritmo o 30 o 300...per
te è uguale?
La sequenza è irriconoscibile...ma a me non sembra affatto uguale il
procedimento per ottenerla!
Poniamo un caso frequente con il solo RAND:
il generatore di numeri estrae:
il 3
poi il 27....poi il 27....poi il 27....poi il 27....poi il 44
tu sprechi 3 colpi che nella realtà sarebbero invece 3 numeri
lecitamente estratti
In realtà tu fai 6 estrazioni per avere 3 numeri!
A me non sembra uguale....ai guru della matematica concettualizzare!
Ovvio che le probabilità rimandono le medesime (anche se usando rand
bari perchè non hai delle sequenze davvero casuali)...chi ha detto il
contrario?Imho però la statistica cambia ...hai il 50% di errore
nell'algoritmo!alias il 50% del tempo sprecato!
Hoy...
In una quantità sufficentemente ampia di estrazioni è possibile rilevare
pattern analoghi se non si utilizzano accorgimenti particolari negli
algoritmi di estrazione. Quindi dovrebbe essere possibile rilevare la
differenza tra una estrazione e l'altra. Diciamo che si potrebbero
generare n sequenze fino a trovare quella che si cerca. E siccome il
generatore non casualizza un bel nulla prima o poi la trovi.
Il problema non è nelle operazioni che si fanno con i numeri generati,
ma il fatto che la generazione delle sequenze si basa su pattern
ripetitivi.
Come diceva Wodka tutto va bene per estrarre un nome in una lista, non è
sufficente per scopi statistici.
--
-> GbC|
www.gbcweb.com
www.chiappori.com
Anche se non è verissimo....può accadere che rand per una volta
azzecchi tutti e 3 i numeri diversi!...se aumenti i numeri
estratti.....la probabiltà di coincidenza Wodka=Rand diminuisce e il
limite a cui tende per infinito è Wodka!
:o)
> La sequenza è irriconoscibile...
E' questo che intendo.
> ma a me non sembra affatto uguale il
> procedimento per ottenerla!
Non ho detto che il procedimento è uguale, ho detto che secondo me
(aspetto prove contrarie) i due procedimenti producono risultati
indistinguibili.
Sei tu che hai detto (estrapolo) "se lo fai su 90 numeri e vuoi
calcolare qualcosa di statistico sballa tutto!". Io ho chiesto, cosa
sballa? In entrambi i casi ho una sequenza di numeri che non si ripetono
e, se come credo, le sequenze non sono riconoscibili, allora i due
metodi sono equivalenti.
> se mi fornisci anche i tenativi dell'algoritmo si!
Ma a me interessa il risultato che produce. Lo sappiamo che l'algoritmo
č diverso, non occorre dimostralo quello :-)
--
news:it-alt.comp.software.openoffice : Il newsgroup dedicato a
OpenOffice.org, la suite open source di applicazioni per ufficio.
Scarica "OpenOffice.org 3: Soluzioni a raccolta", molto piů di semplici
FAQ! http://it.openoffice.org/doc/manuali/
in pratica caro Vitriol e avventurandosi in visioni poetiche:
RAND fà scomparire la materia Wodka la conserva
Nella realtà nel sacchetto ci sono 90 palline...Wodka per estrarne 90
compie 90 tentativi
RAND in un caso particolare ne fa 90...statisticamente ne fà di più!
E la materia dove finisce? Smaterializzazione? Teletrasporto? o uso
improprio di RAND senza pensare a cosa si vuol fare?
eh eh eh :oD
> in pratica caro Vitriol e avventurandosi in visioni poetiche
A me interessano le cose pratiche :-)
--
news:it-alt.comp.software.openoffice : Il newsgroup dedicato a
OpenOffice.org, la suite open source di applicazioni per ufficio.
Scarica "OpenOffice.org 3: Soluzioni a raccolta", molto più di semplici
FAQ! http://it.openoffice.org/doc/manuali/
>
> Ma a me interessa il risultato che produce. Lo sappiamo che l'algoritmo
> è diverso, non occorre dimostralo quello :-)
il risultato deve essre anche finalizzato al problema!
Se simuli qualcosa occhio che con rand gli indici statistici cambiano
perche DOVRESTI tener conto dei tentativi che fai per ottenere quella
sequenza!
un esempio....in una stanza c'è un bimbo con gli occhi uno verde ed
uno azzurro gli altri 9 no!
tu argomenti: 1/10 ha gli occhi così!
Ma sei hai trombato 100 mamme per farne uno così o solo 10 cambia
alquanto l'incidenza di occhi "strani".....(ovvio che tu ed io
preferiremmo trombare 100 mamme!...ma è un altro discorso)
Saluti!
Da focus a le Scienze ne parlano tutti i giornali sciiientifici (il
50% e più dei farmaci sono inutili)
> Se simuli qualcosa occhio che con rand gli indici statistici cambiano
> perche DOVRESTI tener conto dei tentativi che fai per ottenere quella
> sequenza!
Non ti capisco... coma me ne frega del numero di tentativi? Io voglio
una sequenza di numeri casuali che non si ripetono, punto. Come la
ottengo è ininfluente.
Devo estrarre 5 numeri del lotto.
Metodo 1: Li prendo dal sacchetto e ne poso sul tavolo 5.
Metodo 2: Ne tiro fuori uno, scrivo in numero su un foglio, e poi lo
rimetto nel sacchetto. Ne prendo un altro; se non è uscito lo scrivo sul
foglio, altrimenti non lo scrivo. Lo rimetto dentro e così via, fino a
quando non è ho scritti 5 sul foglio.
Che differenza c'è tra le due sequenze estratte? IMHO nessuna, sono
entrambe valide.
Quale metodo è meglio usare? Se lo devo fare a mano sicuramente il
metodo 1. Se uso il 2 sono scemo.
Se lo devo fare col PC invece io scelgo il metodo 2, perché è molto più
semplice da implementare e il PC è veloce.
--
news:it-alt.comp.software.openoffice : Il newsgroup dedicato a
OpenOffice.org, la suite open source di applicazioni per ufficio.
Scarica "OpenOffice.org 3: Soluzioni a raccolta", molto più di semplici
FAQ! http://it.openoffice.org/doc/manuali/
> è l'approccio sbagliato che fanno molte case farmaceutiche per
> propinarci nuovi (costosi) farmaci....
> trial su campioni piccoli scartando le "prove" dannose o ininfluenti
Ma che c'entra? :-)
Ti faccio un esempio più appropriato...
Tu sai che il principio attivo di un farmaco è una certa molecola.
Questa molecola la puoi estrarre da una pianta, oppure la puoi
sintetizzare il dieci modi diversi partendo da reagenti diversi con
processi diversi.
Alla fine ottieni sempre la stessa molecola, e non è possibile
distinguere come è stata prodotta con nessun tipo di prova di
laboratorio o in vivo. A te cosa te ne frega? Ti farà sempre lo stesso
effetto qualunque sia stato il procedimento per ottenerla.
Quale procedimento seguire allora? Il più semplice e economico.
--
news:it-alt.comp.software.openoffice : Il newsgroup dedicato a
OpenOffice.org, la suite open source di applicazioni per ufficio.
Scarica "OpenOffice.org 3: Soluzioni a raccolta", molto più di semplici
FAQ! http://it.openoffice.org/doc/manuali/
Ma se tu devi riempire un camion con varie merci di varie dimensioni
che fai? vai a caso o cerchi una strategia?
Ed anche concettualmente tu che fai?
Ti affidi ad un algoritmo che su 10 numeri può darsi ti faccia
aspettare 5 millisecondi come 2 minuti come infinitamente.
Io invece sono razionalmente nel certo se anche mi proponesse per 10
volte il solito numero uscirebbero 10 numeri diversi.
Più lento su una sequenza ? sicuramente
su 10? si!
su 1.000.000 mmmm si!
su un miliardo? eh beh discutiamone bello
....oltre? vinco io!
Dovresti cominciare a tenere traccia di quante estrazioni butta
via...per renderti conto dello spreco!
> Ti affidi ad un algoritmo che su 10 numeri può darsi ti faccia
> aspettare 5 millisecondi come 2 minuti come infinitamente.
Stai cambiando rotta. Prima dicevi che il risultato non era equivalente,
ora che non è ottimizzato.
C'è un abisso tra le due affermazioni :-)
Mmmm...
Secondo me parti dall'effetto e non dalla causa.
I casi descritti non sono identici, anche se potrebbe sembrarlo.
Caso (1)
Metti la mano e ne prendi 5 uno per uno. Si potrebbe discutere di dove
stanno i numeri, di come è fatto il bussolotto di quanto è lungo il
braccio... Ma diciamo che la casualità è rispettata.
Caso (2)
Come fai?
Perché il 'come' cambia tutto.
Per ogni randomize n generi una sequenza che è identica per ogni n
utilizzato, quindi rnd ti riporta la stessa sequenza di numeri. Che fai?
Generi n in modo casuale? :D Mi pare di vedere la coda del gatto che
sanguina a forza di mordersela... Allora, come da manuale, usi la
funzione timer o qualche pastrocchietto per randomizzare le sequenze...
Ed ecco che la quantità di casi è finita e puoi incorrere in doppioni,
cioè sequenze identiche, che è quello che non vuoi.
Praticamente nel caso (2) ad ogni randomize è come se mettessi lo stesso
bussolotto nella stessa posizione, con lo stesso braccio che prende la
stessa pallina col numero. Le combinazioni sono tante, ma non infinite
come nel caso (1). Da qui la necessità di generare i numeri in modo più
rigoroso ed il proliferare di discussioni come questa ed algoritmi più o
meno potenti per la generazione di numeri random.
Capisci? Non è questione di 'funziona o non funziona' ma è una faccenda
puramente concettuale.
Nel 99% delle richieste che possono capitarci il randomize timer è
assolutamente sufficente.
Se non ricordo male esistono dei servizi web che forniscono numeri
casuali proprio per superare questo problema.
Ciao cia`
--
-> GbC|
www.gbcweb.com
www.chiappori.com
> Capisci? Non è questione di 'funziona o non funziona' ma è una faccenda
> puramente concettuale.
>
> Nel 99% delle richieste che possono capitarci il randomize timer è
> assolutamente sufficente.
Appunto, non stiamo discutendo sulla qualità dei generatori
pseudocasuali, facciamo finta che siano casuali davvero. Stiamo
discutendo sulla equivalenza di due algoritmi, è un esperimento concettuale.
Diciamo che in un tempo infinito non è possibile escludere che possa
arrivare a un certo punto la necessità di un numero di cicli infinito,
ma nella pratica per estrarre 10 numeri sono necessari poco più di 29
tentativi :-)
Qui i dati grezzi (per motivi ideologici solo in formato ODS :-P):
http://cid-fb2e35f564c66807.office.live.com/self.aspx/Files/Cicli.ods
> MI CHETO...e permettimi allibisco!
Mi dici perché dovrebbe essere diverso? Stimo sempre parlando di
risultato finale.
--
news:it-alt.comp.software.openoffice : Il newsgroup dedicato a
OpenOffice.org, la suite open source di applicazioni per ufficio.
Scarica "OpenOffice.org 3: Soluzioni a raccolta", molto piů di semplici
FAQ! http://it.openoffice.org/doc/manuali/
Scusate, cerco di mettere ordine.
Wodka e GBC hanno ragione in parte nel senso che, avendo un generatore
pseudo-casuale, con schemi conosciuti e ripetuti all'infinito, ci sono
una serie di applicazioni che non possono andar bene:
1° Esempio: devo estrarre 20 numeri da un sacchetto di 50 numeri. Le
prove che il generatore dovrà fare sono molto probabilmente > 20.
Inoltre, poichè i numeri non sono realmente casuali, ci saranno delle
combinazioni di numeri più probabili rispetto ad altre, e questo cambia
di molto su simulazioni di estrazioni numeriche rispetto alla realtà.
Soluzione: L'estrazione da un sacchetto "virtuale" invece funzionerebbe
sicuramente in 20 passaggi. Il sacchetto virtuale potrebbe essere un
array riempito dei numeri che ci servono.
2° Esempio: generazione di una chiave di sicurezza casuale. Alcuni
software (TrueCrypt, PGP ecc...) devono generare una chiave di X cifre
casuali. Ora, se noi andiamo a criptare dei dati con una chiave generata
usando RND, sappiamo che tale chiave non è per nulla sicura.
Un hacker potrebbe semplicemente avere un dizionario di
N-milioni/miliardi di chiavi corrispondenti alle esatte combinazioni
conosciute del generatore. In tal caso il tempo di decodifica di un
certo dato passerebbe da centinaia di migliaia di anni ad una settimana.
Soluzione economica: E' per questo che per aumentare la sicurezza,
questi programmi prendono anche in considerazione i movimenti del mouse
che l'utente deve effettuare (su richiesta del programma) mentre viene
generata la chiave.
Nicola
> Wodka e GBC hanno ragione in parte nel senso che, avendo un generatore
> pseudo-casuale, con schemi conosciuti e ripetuti all'infinito, ci sono
> una serie di applicazioni che non possono andar bene
Aridaje... è dura ragionare con gli informatici e con gli ingegneri... :-P
Ma tu poni di far finta che i numeri siano davvero casuali, invece ciò
non è così, ed io ti ho portato due esempi pratici e reali di come porre
delle premesse sbagliate possa portare ad avere problemi, anche grossi.
Poi, come dice il buon GBC, nel 99% (ma io ti dico il 99,99%) dei casi
non ci poniamo il problema. Però è utile saperlo.
Nicola
> Ma tu poni di far finta che i numeri siano davvero casuali, invece ciò
> non è così
La mia risposta originale da cui è disceso tutto era rivolta al primo di
messaggio di Wodka40, che era diviso in due punti ben distinti.
Al primo punto poneva il problema della pseudocasualità, e questo mi
stava più che bene.
Al secondo punto diceva invece che usare il "metodo della esclusione a
posteriori" era un errore concettuale, e avrebbe prodotto risultati non
validi statisticamente. Bisognava invece usare il "metodo della
tombola", che ben simulava il caso. Non si faceva cenno alla
pseudocasualità, già nominata prima. Cito:
--------
Un limite dell'algoritmo:
tu vuoi una sequenza di 10 numeri! COME LA VUOI?
Indipendentemente dalle estrazioni...va bene TUTTO quello che ti hanno
detto!
MA
vuoi simulare il lotto? NON VA BENE UN CAZ...ops...NULLA!
---------
se lo fai su 90 numeri e vuoi calcolare qualcosa di statistico sballa tutto!
----------
In sintesi: avere una sequenza di 10 numeri con 100 tentativi e
diverso assai che averla con 10 tentativi! Sballa tutto in alcuni
ambiti!
-----------
Ecco, è questo che io contestavo e chiedevo eventuali informazioni visto
che non sono un matematico. Queste informazioni non sono arrivate, e io
rimango convinto che il "metodo della esclusione a posteriori" e quello
"della tombola" (nomi miei perché, essendo ignorante, non so se hanno un
nome) sono equivalenti e producono risultati indistinguibili.
Su una cosa mi trovo d'accordo, cioè che il metodo della esclusione può
portare a un numero di cicli illimitato (per assurdo anche infinito), ma
nel mondo reale non penso proprio che possa essere un problema. Penso
che sia più probabile che una fluttuazione quantistica materializzi nel
mio letto una copia perfetta di Jessica Alba :-P
Mi inserisco provando a fare ulteriore chiarezza (non è detto che ci riesca,
eh!).
Ragioniamo in termini teorici, considerando il generatore di numeri random
veramente casuale.
I due algoritmi di estrazione, perfettamente descritti da Wodka, sono
effettivamente la modellazione di 2 diversi "processi stocastici" (spero di
non aver cannato il termine).
Ma (ed è questo che secondo me intende Vitriol) entrambi danno origine alla
stessa distribuzione di probabilità delle possibili sequenze estratte.
Infatti non sembra esistere alcuna ragione per cui una determinata sequenza
possa risultare più frequente (più probabile) utilizzando un algoritmo
piuttosto che un altro.
Di questo assunto probabilmente si riesce a dare una dimostrazione
matematica (e nemmeno troppo complicata, direi ad intuito).
Bye
Raf
> Ma (ed è questo che secondo me intende Vitriol) entrambi danno origine alla
> stessa distribuzione di probabilità delle possibili sequenze estratte.
e...satto! ;-)
[cut]
> vuoi simulare il lotto? NON VA BENE UN CAZ...ops...NULLA!
> Ragiona:
> 1 tentativo) 90 numeri in un sacco...estrazione random....1 numero
> estratto
> 2 tentativo? 90 numeri in un sacco? NO! 89 in un sacco!!!! se lo fai
> su 90 numeri e vuoi calcolare qualcosa di statistico sballa tutto!
>
> Ho fatto a suo tempo un algoritmo che teneva conto di ciò e non è
> affatto semplice!
> in sintesi:
>
> 1)prendi una matrice e riempila random di numeri
> 2)estrai un numero fra limite min e limite max della matrice
> 3)cancella il numero dalla matrice e fanne una nuova UGUALE SENZA IL
> BUCO del numero estratto
> 4) ritorna al punto 2 e loop per quanti numeri vuoi estrarre
>
> Vedrai che alla prima estrazione estrai un numero fra 90 numeri poi
> fra 89 poi fra 88 e così via...come se fosse il sacco della tombola!
Tempo fa ho fatto una cosa simile... proprio con i 90 numeri.
Invece di usare una matrice da riempire random, ho usato qualcosa di
molto simile... ho usato una "collection" riempiendola di numeri da 1 a
90 ma inserendoli casualmente all'inizio o alla fine dell'ultimo numero,
in questo modo avevo tutti i numeri ma in modo casuale all'interno del
sacchetto.
Facendo l'estrazione poi estraevo casualmente vale che corrispondeva
all'indice del numero del sacchetto... ovviamente da 1 a n=numero di
"palline" disponibili
Ovviamente prima di ogni generazione del numero casuale ho sempre
eseguito il comando "Randomize" per inizializzare generatori di semi con
il Timer... lo so sempre "pseudocasuale" ma sempre meglio di nulla.
--
Daniele Pinna (leva oops. per rispondere)
Utente Skype: dapinna
Sito Web: http://www.dapinna.com <-- Nuovo Sito... ora in Joomla
Il Docfa in Pillole: http://www.ildocfainpillole.it
-----
Now Powered by Linux KUbuntu 10.04 "Lucid Lynx"
Non mi è chiaro, vuoi dire che in pratica ciascun numero da 1 a 90 viene
inserito in testa o in coda alla collection a seconda del numero random
estratto?
O è diverso?
La probabilità è salva se sono 1/90 1/89 1/88 1/87 1/86 1/85 tali
rimangono!
L'indice statistico no!
io ci metto un errore di generazione dello 0%...tu non lo sai!
io ci metto un tempo "noto"...tu non lo sai!
Ora visto che sei chimico quindi sciiiiienziato nulla è da aborrire
più nella scienza che l'intervento divino: perchè non spiega nulla e
fai un atto di fede!
Quando produci qualcosa non è importante SOLO quello che produci ma
anche COME lo produci. Spesso errori grossolani (per fare prima) si
sono propagati per secoli inducendo teorie errate!
cmq
lo ripeto...
se mi dai anche il numero di tenativi del generatore sò riconoscere
una sequenza mia da una tua (con buona approssimazione
STATISTICA)...ma NON INFALLIBILMENTE!...non sono Dio!
:)
No... faccio un ciclo for da 1 a 90, lineare e non casuale.
per ogni numero da inserire nella collection genero un numero casuale da
1 a 2. Se esce 1 lo metto prima, se esce 2 lo metto dopo.
In questo modo ho i 90 numeri nella collection in modo abbastanza mischiato.
A questo punto inizio l'estrazione.
Ho dimenticato di dire prima che, dopo aver estratto un numero da 1 "n"
(dove "n" è il numero dei numeri rimasti nel sacchetto"), uso quel
numero come *indice* della collection per:
- leggere il numero associato a quell'indice
- cancellare quell'indice dal sacchetto
la prima estrazione avviene su 90 numeri
la seconda su 89
la terza su 88
etc.
In questo modo è più simile a quella reale.
Tra le altre cose, dato che volevo un pò più di casualità (ma so
benissimo che non serve a nulla), facevo in modo che prima di ogni
estrazione, non solo venisse reinizializzato il seme, ma l'estrazione di
ogni numero (e la suddetta reinizializzazione) doveva essere preceduta
da una pausa casuale da 1 a 10 secondi.
In pratica è imprevedibile quando l'inizializzazione dei numeri random
(che viene fatta usando il contenuto del valore "timer") è ancora più
causale.
Intendi prima/dopo *l'ultimo elemento della collection*, giusto?
> In questo modo ho i 90 numeri nella collection in modo abbastanza
> mischiato.
>
> A questo punto inizio l'estrazione.
> Ho dimenticato di dire prima che, dopo aver estratto un numero da 1 "n"
> (dove "n" è il numero dei numeri rimasti nel sacchetto"), uso quel
> numero come *indice* della collection per:
> - leggere il numero associato a quell'indice
> - cancellare quell'indice dal sacchetto
Ok, quindi per le estrazioni utilizzi un ulteriore indice random, giusto?
> la prima estrazione avviene su 90 numeri
> la seconda su 89
> la terza su 88
>
> etc.
> In questo modo è più simile a quella reale.
> Tra le altre cose, dato che volevo un pò più di casualità (ma so
> benissimo che non serve a nulla), facevo in modo che prima di ogni
> estrazione, non solo venisse reinizializzato il seme, ma l'estrazione di
> ogni numero (e la suddetta reinizializzazione) doveva essere preceduta
> da una pausa casuale da 1 a 10 secondi.
>
> In pratica è imprevedibile quando l'inizializzazione dei numeri random
> (che viene fatta usando il contenuto del valore "timer") è ancora più
> causale.
Ho capito: in pratica crei una collection con i numeri in disordine e poi li
peschi a caso... per "aggiungere casualità".
> se mi dai anche il numero di tenativi del generatore sò riconoscere
> una sequenza mia da una tua (con buona approssimazione
> STATISTICA)...ma NON INFALLIBILMENTE!...non sono Dio!
Ma il numero di tentativi non fa parte del risultato. E' come se ti
dicessi "se mi dai il codice che hai usato io so dirti il metodo che hai
usato". Grazie tante :-)
Io so solo che le sequenze generate dal "mio" metodo fino a prova
contraria sono buone quanto le sequenze generate dal "tuo". Hai una
dimostrazione che non è così? Se ce l'hai ti dico hai ragione, l'ho
detto dall'inizio che aspettavo informazioni in proposito.
Poi non è che devo per forza fare il difensore del metodo a esclusione,
è solo la cosa più semplice che mi è venuta in mente :-)
> Questi sono i risultati:
> 29,42 29,32 29,07 29,41 29,41
Qualche curiosità. Su 5000 estrazioni il numero minimo di tentativi è
stato 10 (il minimo possibile) verificatosi 3 volte. Il massimo 94 :-)
La media già detta, 29.3
1) le sequenze tue sono buone come le mie...ma tu valuti il
RISULTATO...io valuto il metodo per generare il risultato!
2)Le tue sequenze se mi dai il numero di tentativi sono in ottima
approssimazione riconoscibili dalle mie
3) Ho buttato giu in po di codice...si può sempre opinare ed obiettare
il metodo scelto e quindi tutto è migliorabile.
Il metodo "brute force" però da miei test è da pochi a svariati ordini
di grandezza PIU' LENTO! Quindi non conveniente!
se ti interessa metto on line il codice per dimostarlo
> 1) le sequenze tue sono buone come le mie...ma tu valuti il
> RISULTATO...io valuto il metodo per generare il risultato!
E' quello che ho detto io dall'inizio :-)
> se ti interessa metto on line il codice per dimostarlo
Se lo hai già fatto certo, mi interessa. Però non cambia di una virgola
quello si è detto fino ad ora, visto che si parlava di validità
statistica delle estrazioni (quindi dei risultati) non di efficienza
prestazionale dell'algoritmo.
Io la dimostrazione matematica che i due algoritmi sono *statisticamente*
equivalenti l'avrei anche trovata, volendo la posso postare, anche se non
siamo nel NG più adatto...
> Poi non è che devo per forza fare il difensore del metodo a esclusione, è
> solo la cosa più semplice che mi è venuta in mente :-)
Solo per la cronaca, il metodo computazionalmente ottimale per produrre
"rimescolamenti casuali" a partire da un insieme di numeri dovrebbe essere
questo:
http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
Ciao
Raf
> Io la dimostrazione matematica che i due algoritmi sono*statisticamente*
> equivalenti l'avrei anche trovata, volendo la posso postare, anche se non
> siamo nel NG più adatto...
Ormai siamo in ballo... se hai voglia e tempo potrebbe essere istruttivo.
Copiate e incollate questo codice
'INIZIO
Imports System.Collections.Generic
Imports System.Text
Public Class Form1
Dim sacco As New List(Of Integer)
Dim NumeriDesiderati As Integer = 6
Dim NumeriSacco As Integer = 90
Private Sub Estrai_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Estrai.Click
Dim t(), v() As Integer
'pulizie di ferragosto!!!
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
GeneraSacco(NumeriSacco)
t = EstraiSacco(NumeriSacco, NumeriDesiderati)
v = EstraiRandom(NumeriSacco, NumeriDesiderati)
'stampa
For Each h As Integer In t
TextBox2.Text += (h.ToString + " - ")
Next
For Each h As Integer In v
TextBox3.Text += (h.ToString + " - ")
Next
End Sub
Private Sub GeneraSacco(ByVal elementiSacco As Integer)
sacco.Clear()
For n = 1 To elementiSacco
sacco.Add(n)
Me.TextBox1.Text += (n.ToString + " ")
Next
End Sub
Private Function EstraiSacco(ByVal NumeriNelSacco As Integer,
ByVal NumeridaEstrarre As Integer) As Integer()
'MISURA PRESTAZIONI
Dim t As New Stopwatch
t.Start()
'****
Dim estrazione As New System.Random()
Dim valore
Dim limite As Integer
limite = NumeriNelSacco + 1
Dim estratto As Integer = 0
Dim Estratti(NumeridaEstrarre - 1) As Integer
Do
valore = (estrazione.Next(1, limite)) - 1
Estratti(estratto) = sacco(valore)
sacco.RemoveAt(valore)
limite -= 1
estratto += 1
Loop Until estratto = NumeridaEstrarre
'STAMPA PRESTAZIONI
t.Stop()
ListBox1.Items.Add("Sacco: " + t.ElapsedTicks.ToString)
Return Estratti
End Function
Private Function EstraiRandom(ByVal NumeriNelSacco As Integer,
ByVal NumeriDaEstrarre As Integer) As Integer()
'MISURA PRESTAZIONI
Dim t As New Stopwatch
t.Start()
'****
Dim estrazione As New System.Random()
Dim Estratti(NumeriDaEstrarre - 1) As Integer
Dim conta As Integer = 0
Dim valore As Integer
Dim limitesup As Integer = NumeriNelSacco + 1
Do
valore = estrazione.Next(1, limitesup)
If Not Estratti.Contains(valore) Then
Estratti(conta) = valore
conta += 1
End If
Loop Until conta = NumeriDaEstrarre
'STAMPA PRESTAZIONI
t.Stop()
ListBox1.Items.Add("RANDOM: " + t.ElapsedTicks.ToString)
Return Estratti
End Function
End Class
'FINE
Tengo a precisare che sono tutti integer perchè una CPU non a 64 bit
ottimizza per integer e non per long (almeno a me hanno insegnato
così)
Il conteggio dei tick avviene SOLO nell'algoritmo e non negli orpelli
di sovrastruttura per dare un minimo di interfaccia.
Ho parametrizzato il più possibile
Risultati
Sacco è l'algoritmo della tombola ...Random è un RAND!
PER SEQUENZA DI 6 NUMERI (in ticks)
Sacco: 324
RANDOM: 7333 (qui probabilmente non lo considerare...forse crea ed
inizializza qualche array...o è un errore mio boh!)
Sacco: 82
RANDOM: 166
Sacco: 90
RANDOM: 131
Sacco: 89
RANDOM: 217
Sacco: 92
RANDOM: 191
Sacco: 77
RANDOM: 139
Sacco: 76
RANDOM: 139
Sacco: 78
RANDOM: 150
MA se raddoppi e cerchi sequenze di 12 numeri ...va che roba...
Sacco: 304
RANDOM: 3334
Sacco: 96
RANDOM: 277
Sacco: 80
RANDOM: 206
Sacco: 154
RANDOM: 319
Sacco: 79
RANDOM: 192
Sacco: 80
RANDOM: 183
Sacco: 80
RANDOM: 191
Sacco: 78
RANDOM: 204
probabilmente sarà tutto ottimizzabile...se vuoi generare byte ad
esempio rand di net ha già una funzione precostituita...ma se vuoi
degli integer anche secondo msdn devi fare estrazioni ripetute e
controllare che non sià già uscito
...a questo punto con un po di generics.....mi sembra che il lume
valga la candela!
p.s.
per copiare dalla listbox alla clipboard ho usato:
'inizio
Private Sub ListBox1_KeyUp(ByVal sender As Object, ByVal e As
System.Windows.Forms.KeyEventArgs) Handles ListBox1.KeyUp
If e.KeyCode = Keys.Insert Then
My.Computer.Clipboard.Clear()
For Each s As String In Me.ListBox1.Items
My.Computer.Clipboard.SetText(My.Computer.Clipboard.GetText &
vbNewLine & s)
Next
End If
End Sub
'fine
l'ho associato al tasto insert!
p.p.s.
Potevo tracciare con un else quanti tentativi a vuoto faceva il metodo
random. Ma avrebbe inevitabilmente appesantito l'algoritmo rendendolo
ancora più lento! Siccome non voglio sparare sulla croce rossa non
l'ho fatto!
Ultimate p.p.p.s
Spero di aver dimostrato come un metodo brute force giunga al medesimo
risultato...ma non ottimizzando un piffero!
Se poi volete usare un "brute force" per craccare un file RSA...fate
voi!
Sempre e soltanto per dare i miei 2cents (anzi 1 che c'è crisi) alla
discussione!....e posso anche sbagliarmi!
> Sempre e soltanto per dare i miei 2cents (anzi 1 che c'č crisi) alla
> discussione!
Bene, grazie del contributo. Alla fine mi pare che questo thread sia
diventato la riposta piů esaustiva a questa questione, che si ripresenta
ciclicamente :-)
--
news:it-alt.comp.software.openoffice : Il newsgroup dedicato a
OpenOffice.org, la suite open source di applicazioni per ufficio.
Scarica "OpenOffice.org 3: Soluzioni a raccolta", molto piů di semplici
FAQ! http://it.openoffice.org/doc/manuali/
PROBLEMA: estrarre 5 numeri diversi tra n numeri
RISOLUZIONE:
fare 10 estrazioni per trovare 5 numeri diversi
OPPURE
farne 5 per trovare 5 numeri diversi
per me è diverso....cosa non te lo sò dire...sicuramente il tempo per
arrivare alla soluzione! La probabilità rimarra la solita....ma
Vitriol è sempre a generare...ed io sono già in ricevitoria!!! E se
sulla schedina ha appuntato anche le iterazioni per generarla so
riconoscere la sua sequenza da una mia....con buona approssimazione!
> ma Vitriol è sempre a generare...ed io sono già in ricevitoria
ROTFL
Il fatto è che io non ho mai giocato una schedina, e intendo continuare
così. Come diceva Cavour, il gioco d'azzardo è la tassa sugli imbecilli :-)
> ROTFL
> Il fatto è che io non ho mai giocato una schedina, e intendo continuare
> così. Come diceva Cavour, il gioco d'azzardo è la tassa sugli imbecilli :-)
Vabbè
Chi visse sperando ...morì cacand<biiiiip>
Ma è anche stato detto:
Ma la vita è un sogno o i sogni aiutano a vivere meglio? (G. Marzullo)
LOL!
Disclaimer: mi scuso coi matematici di professione (o comunque con quelli
che hanno la materia più fresca di me) per eventuali imprecisioni
notazionali.
Problema: da un insieme A = {a[1], a[2], ..., a[n]} si deve estrarre un
sottoinsieme X di m<=n elementi {x[1],...,x[m]}
Metodo 1 (alias "sacchetto" alias "wodka")
- per determinare ciascun elemento del sottoinsieme, si estrae casualmente
un elemento da A rimuovendolo da esso ed inserendolo nel sottoinsieme
parziale
Metodo 2 (alias "foglietto" alias "vitriol")
- per determinare ciascun elemento del sottoinsieme, si estrae casualmente
un elemento da A senza rimuoverlo, e lo si aggiunge al sottoinsieme parziale
solo se non ancora presente in esso, ripetendo eventualmente l'estrazione
per un numero indefinito di tentativi
Perché i due metodi siano statisticamente equivalenti occorre che la
probabilità di ciascuna sequenza X sia uguale in entrambi i casi.
In generale P(X) = probabilità di estrarre una certa sequenza
X={x[1],...,x[m]}
Si ha P(X) = P1 * P2 * ... * Pm
dove con Pk in generale indico la probabilità che il valore della k-esima
estrazione sia x[k].
A questo punto è sufficiente dimostrare che Pk sia lo stesso nei due casi.
Con il metodo 1 è facile vedere che P1=1/n, P2=1/(n-1), P3=1/(n-2),...
In generale Pk=1/(n-k+1) visto che ad ogni estrazione il numero di
possibilità decresce di 1.
Col metodo 2 la cosa è leggermente più complicata, perché un certo elemento
può venire estratto anche utilizzando più tentativi, per cui le probabilità
si compongono.
Pk = P(estrarre x[k] al 1° tentativo)
+ P(estrarre x[k] al 2° tentativo) * P(estrarre un numero già in X al 1°
tentativo)
+ P(estrarre x[k] al 3° tentativo) * P(estrarre numeri già in X al 1° e
al 2° tentativo) + ...
Dato che la probabilità di estrarre x[k] è sempre 1/n, qualunque sia il
numero di tentativi che occorrono, e che invece la probabilità di estrarre
un numero già presente nella sequenza parziale {x[1],...,x[k-1]} è (k-1)/n
elevato al numero di tentativi successivi, si ha:
Pk = 1/n + 1/n * (k-1)/n + 1/n * [(k-1)/n]² + 1/n * [(k-1)/n]³ + ...
il cui valore è 1/n * la somma di una serie geometrica di ragione (k-1)/n
(che quindi la fa convergere essendo strettamente <1)
Pk = 1/n * (∑i=0..∞ [(k-1)/n]^i) = 1/n * (1/(1-(k-1)/n))
e quindi
Pk = 1/(n-k+1) come nel caso precedente.
Voilà!
Ciao
Raf
> Pk = 1/(n-k+1) come nel caso precedente.
>
> Voilà!
>
> Ciao
Ma non avevi meglio di nulla da fare? :))
> Disclaimer: mi scuso coi matematici di professione (o comunque con quelli
> che hanno la materia più fresca di me) per eventuali imprecisioni
> notazionali.
Grazie!
Haha... in effetti... però mi intrigava parecchio la cosa!
Ciao
Raf
> Ma non avevi meglio di nulla da fare?
Perché? Tanto di capello. E' sempre un investimento per tutti imparare
qualcosa, e se riesci a formalizzarlo personalmente è pure una
soddisfazione personale.
>> Ma non avevi meglio di nulla da fare?
>
> Perché? Tanto di capello. E' sempre un investimento per tutti imparare
> qualcosa, e se riesci a formalizzarlo personalmente è pure una
> soddisfazione personale.
Non hai quotato le faccine
> Non hai quotato le faccine
Concorso di colpa col metodo di quote della selezione di Thunderbird :-)
Se la levi dal sacchetto...sei sicuro che non la riprendi!
Se ce la lasci in barba (anzi IN VIRTU') della probabilità e del fatto
che i numeri non hanno memoria può uscire il solito numero per un
mese!
Mi sembra di capire che in un numero sufficientemente (congruo?
boh)alto di estrazioni....si equivalgono i risultati.
Ma se non ho tutto questo tempo?
te la "servo" da un altro punto di vista
...se i 2 algoritmi girano su 2 core diversi ed ad un certo punto
devono unire i risultati...tu indifferentemente usi l'uno per l'altro?
Il rafunk che conosco dal ng ero sicuro mi rispondesse di no...ma ora
non lo sono più! ghghgh! :P
OVVIO che la probabilità è rispettata....
ma la statistica mi dice che per trovare 6 numeri diversi ho fatto 70
estrazioni (ad esempio)....mentre l'omino del superenalotto ha
soltanto schiacciato per 6 volte un bottone!
Conterà qualcosa?Sarà un campanello che sto facendo una "simulazione"
palesemente errata???
Se mi danno un problema....estrare una sequenza di numeri...perchè
devo usare metodi ridondanti "brute-force"?Anzi "brutal-force"!...che
poi non sono nemmeno tanto "force" ???
eh eh eh eh!
>> No... faccio un ciclo for da 1 a 90, lineare e non casuale.
>> per ogni numero da inserire nella collection genero un numero casuale da
>> 1 a 2. Se esce 1 lo metto prima, se esce 2 lo metto dopo.
>
> Intendi prima/dopo *l'ultimo elemento della collection*, giusto?
Esatto.
>> A questo punto inizio l'estrazione.
>> Ho dimenticato di dire prima che, dopo aver estratto un numero da 1 "n"
>> (dove "n" è il numero dei numeri rimasti nel sacchetto"), uso quel
>> numero come *indice* della collection per:
>> - leggere il numero associato a quell'indice
>> - cancellare quell'indice dal sacchetto
>
> Ok, quindi per le estrazioni utilizzi un ulteriore indice random, giusto?
Giusto.
>> In pratica è imprevedibile quando l'inizializzazione dei numeri random
>> (che viene fatta usando il contenuto del valore "timer") è ancora più
>> causale.
>
> Ho capito: in pratica crei una collection con i numeri in disordine e
> poi li peschi a caso... per "aggiungere casualità".
Esatto :-)
--
Daniele Pinna
DAPINNA.COM
(leva oops per rispondere)
www.dapinna.com
www.ildocfainpillole.it
Eheheh, ma quel rafunk aveva il cappellino "informatico"... in questo caso
me lo sono tolto per mettere quello con scritto "matematico"!
Non stavo quindi ragionando dal punto di vista computazionale ma prettamente
teorico.
È come se avessi a disposizione un tempo infinito (o meglio, una macchina
che esegue istantaneamente ogni operazione) e un generatore di numeri
realmente casuali.
> OVVIO che la probabilità è rispettata....
> ma la statistica mi dice che per trovare 6 numeri diversi ho fatto 70
> estrazioni (ad esempio)....mentre l'omino del superenalotto ha
> soltanto schiacciato per 6 volte un bottone!
> Conterà qualcosa?Sarà un campanello che sto facendo una "simulazione"
> palesemente errata???
A dispetto di ciò che potrebbe apparire intuitivamente, la matematica
dimostra che a livello teorico sono simulazioni perfettamente equivalenti,
nel senso che le sequenze generate con l'uno o l'altro metodo sono
indistinguibili, cioè non vi sono "polarizzazioni" ma ogni n-upla è
equamente probabile in entrambi i metodi.
Trasferendo i due processi in ambito pratico (= implementandoli su PC) non
si può però non tenere in considerazione il fattore tempo, visto che non
esistono "core" che girano a velocità infinita.
Non solo, bisognerebbe considerare anche che il generatore di numeri è solo
pseudo-casuale, e non può quindi generare ogni possible sequenza di numeri
casuali, ma questa prima o poi si ripeterà (il quando dipende dalla
dimensione in bit del "seme" utilizzato per inizializzare il generatore).
> Se mi danno un problema....estrare una sequenza di numeri...perchè
> devo usare metodi ridondanti "brute-force"?Anzi "brutal-force"!...che
> poi non sono nemmeno tanto "force" ???
Non posso che darti pienamente ragione.
Se dovessi scegliere un algoritmo performante di sicuro non opterei per uno
che ha una minima probabilità di non terminare (o meglio, di metterci un
tempo spropositato, perché termina di sicuro in virtù del fatto che il
generatore è pseudo-casuale).
Ad esempio l'algoritmo di Fisher-Yates:
http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
Ciao!
Raf
>> Non hai quotato le faccine
>
> Concorso di colpa col metodo di quote della selezione di Thunderbird :-)
Usa un news reader serio tipo il mio :)
Avendo n=10 arr(10)=numeri da 1 a 10, con 10 estrazioni si ha la serie.
Do While n > 0
t = Int(n * Rnd + 1)
List1.AddItem arrN(t)
If t <> n Then
arrN(t) = arrN(n)
End If
n = n - 1
Loop
--------------------------------
Inviato via http://arianna.libero.it/usenet/
boh...a parte la sostituzione
arrN(t) = arrN(n) che è tutto fuorchè random
ho provato a farlo per vb.net...e mettere un console.writeline...
simula delle casualità uguali
prova a mettere t= qualche numero...a me escono sequenze con 2 numeri
uguali!
Rimango della mia idea..."togliere la pallina" è la soluzione
migliore!...e anche abbastanza veloce!
Manca il Randomize che resetta la generazione
pseudocasuale
Ma questa routine toglie la pallina!
se per esempio il primo numero estratto fosse t=3
utilizzo il numero contenuto in arrN(3)
copio in arrN(3) l'ultimo degli array arrN(10)
diminuisco n di uno, per cui arrN(10) dove ora c'è il numero appena
estratto non sarà più considerato perchè la prossima estrazione sarà tra
1 e 9.
E così via.
Perchè manca l'istruzione RANDOMIZE
NO.....leva RAND e metti ad esempio t=4...può succedere che venga
fuori (non è impossibile)....a me escono 2 numeri uguali...
e ciò basta a confutare l'esattezza (non puoi estrarre un numero che
non esiste più nel sacchetto)
è sicuramente un errore di scrittura ....mio forse.....
ma concettualmente rimango della mia idea: io lancio una freccetta su
un piano che gira....perchè poi tipo gioco dell'oca devo saltare ad
una casella?
Ma sono sofismi....
Dim controllo(10) as integer
dim flag,numero as integer
flag=0
do
Randomize()
numero = Int((10) * Rnd() ' numero a caso
if controllo(numero)=0 then
controllo(numero)=1
flag=flag+1
list1.additem(numero)
end if
if flag = 10 then exit loop ' se sono usciti tutti e 10 esce
loop
Mi hai fatto prendere excel e dargli di VBA
Sub Pulsante1_Click()
Dim controllo(10) As Integer
Dim flag As Integer
Dim numero As Integer
Dim genera As Integer
genera = 0
flag = 0
Debug.Print "START-----------------------------"
Do
Randomize
numero = Int((10) * Rnd()) ' numero a caso
genera = genera + 1
If controllo(numero) = 0 Then
controllo(numero) = 1
flag = flag + 1
Debug.Print numero
End If
If flag = 10 Then Exit Do ' se sono usciti tutti e 10
esce
Loop
Debug.Print "Usato: " + CStr(genera) + " RND "
Debug.Print "STOP-----------------------------"
End Sub
Vai e medita!.....TUTTA la discussione NON è su questo!
io faccio 5 colpi e ho 5 numeri diversi
lo script di sopra almeno 2/3 volte tanto come tentativi!
report:
START-----------------------------
5
9
1
4
2
7
3
6
0
8
Usato: 26 RND
STOP-----------------------------
START-----------------------------
3
9
5
0
2
6
8
7
4
1
Usato: 17 RND
STOP-----------------------------
START-----------------------------
9
2
3
1
6
8
4
7
5
0
Usato: 20 RND
STOP-
Ripeto.....astenetevi se non avete capito il senso della
discussione...create altra confusione agli inesperti!
<Mi hai fatto prendere excel e dargli di VBA
<Sub Pulsante1_Click()
<Debug.Print "Usato: " + CStr(genera) + " RND "
<Debug.Print "STOP-----------------------------"
<End Sub
<Vai e medita!.....TUTTA la discussione NON è su questo!
<io faccio 5 colpi e ho 5 numeri diversi
<lo script di sopra almeno 2/3 volte tanto come tentativi!
Ma che devo meditare...?
Andrea mica ha chiesto una ottimizzazione del LOOP
Ha chiesto :
1)Devo generare una sequenza di numeri in modo casuale da 1 a 10 ma senza
che
questi vengano ripetuti.
2)Vorrei utilizzare una sola variabile che cambia valore (da 1 a 10) dopo
averla utilizzata.
Al massimo la differenza sta nel fatto che la variabile viene utilizzata
come Booleana.....
<Ripeto.....astenetevi se non avete capito il senso della
<discussione...create altra confusione agli inesperti!
Mi scusi ...professsore.... io volevo solo dare il mio contributo
Perchè se tu lasci fare alla routine, dopo la prima estrazione con n = 4
dove t = Int(n * Rnd + 1) da come
risultato 4, il numero massimo che potrà essere estratto è 3 e non ci
sarà nessuna ripetizione.
Se tu lasci sempre t=4 è chiaro che ad un certo punto c'è la ripetizione,
in questo caso l'ottava cifra
estratta è uguale alla precedente.
se per 10 volte esce 4?
L'algoritmo ha un buco!
Può uscire per 10 volte 4?...và a chiederlo a chi gioca alla roulette!
;)