Newsgroup: it.comp.appl.macromedia
Titolo: [DIR] Riempire una lista con valori random

Sto cercando di costruire una routine che, grazie alla funzione "random" mi
riempia una lista con dieci valori diversi ma compresi tra 1 e 20.
Ho provato in vari modi ma non riesco a cavarne piedi.
So' che č una stupidata risolvibile in poche rifghe di Lingo... forse ho
dormito poco...
Qualcuno mi aiuta?
Marina P


eheehhehehe
infatti e' una stupidata.... almeno per chi sa come farlo...... come tutte
le cose, del resto... :)
cmq, ti avevo detto che siamo a tua disposizione, ed e' giunto il momento di
dimostrarlo....
Ho letto il tuo post da una postazione dalla quale non potevo postare a mia
volta, e speravo di poterti rispodere io, visto che la 'sfida' lanciata mi
intrigava..... e difatti non sono riuscito a controllarmi..... una volta
alla tastiera le dita andavano da sole (la matematica e' il mio primo
amore....) ti invio dunque uno script che genera una lista di n valori
random diversi compresi tra x ed y. Sarai tu a mettere i valori che vuoi
(nel tuo caso rispettivamente 10,1,20)
Per ottenere il risultato, metti i seguenti handler in uno script di movie:
on generaLista (minimo, massimo, numeroValori)
  if (minimo > massimo) or (minimo < 1) or (numeroValori < 1) or
(numeroValori > massimo-minimo+1) then return FALSE
  lista = []
  varWork = generaValore (minimo, massimo)
  lista = [varWork]
  repeat while true
    if lista.count = numeroValori then exit repeat
    nuovoValore = generaValore (minimo,massimo)
    varWork = checkDoppioni (nuovoValore,lista)
    if varWork then lista.add(nuovoValore)
  end repeat
  return lista
end
on generaValore (minimo,massimo)
  repeat while TRUE
    varWork = random(massimo)
    if varWork > (minimo-1) then exit repeat
  end repeat
  return varWork
end
on checkDoppioni (nuovoValore,lista)
  repeat with i = 1 to lista.count
    if nuovoValore = lista[i] then return FALSE
  end repeat
  return TRUE
end
Quando avrai bisogno di generare una lista, scriverai questo nello script
che vuoi tu:
NomeLista = generaLista (minimo, massimo, numeroValori)
    if NomeLista then
        -- quello che vuoi
    else
        -- hai passato valori non accettati e la lista vale 0
    end if
dove NomeLista e' il nome che darai alla tua variabile. Le variabili che ho
usato nello script sono tutte locali, dunque non interferiranno col resto
del tuo applicativo. Lo script compie anche una serie di controlli e
restituisce FALSE (cioe' 0) nei seguenti casi:
- se il valore massimo e' minore del minimo
- se il minimo vale 0 o e' negativo
- se il numero di valori che vuoi in lista e' minore di 1
- se chiedi piu' valori di quanti ce ne siano tra il minimo ed il massimo
compresi
Nel caso in cui chiedi una lista di un valore, la funzione ti restituisce in
pratica un numero random compreso tra minimo e massimo. In effetti se vuoi
semplicemente un random compreso tra minimo e massimo puoi benissimo usare
l'handler apposito e scrivere:
ValoreRandom = generaValore (minimo,massimo)
hope help y
asleo

 cerchero` un'altra donna dentro ai sogni di Tarzan

 20 elementi random nel range tra 1 e 20, senza ripetizioni.
Vero. Pero' Marina aveva chiesto una lista di 10 elementi (non 20) presi tra
i numeri 1 e 20.....
La funzione che ho postato ieri (anche sul ng 'fratello' di MM, dove Marina
ha replicato il suo post) e che ancora non so se a Marina e' andata bene, fa
appunto quello che lei chiede....
giusto per completezza, riporto anche la routine proposta da PuppetSprite
(sempre sull'altro ng) che realizza lo stesso risultato della tua routine (e
che, ancora una volta), Marina non ha fatto sapere se le va bene....:
on randomList numValori
  rndList = []
  n = numValori
  repeat with i = 1 to numValori
    rndList[i] = 0
  end repeat
  repeat with i = 1 to numValori
    p = random(numValori)
    repeat while rndList[p] <> 0
      p = random(numValori)
    end repeat
    rndList[p] = i
  end repeat
  put rndList
end
Infine, lo stesso PuppetSprite ha ottimizzato lo script proposto da me,
cancellando la routine checkDoppioni() e modificando il ciclo repeat
all'interno della routine principale in questo modo:
repeat while true
    if lista.count = numeroValori then exit repeat
    nuovoValore = generaValore (minimo,massimo)
    if lista.findPos(nuovoValore) = 0 then
      lista.add(nuovoValore)
    end if
end repeat
ciao
asleo