Newsgroup: it.comp.lang.javascript
Titolo: NEWBIE incasinato!!

Ciao a tutti,il nostro prof ci ha dato un esesrcizio in cui scopo
č:attraverso script creare una tabella che scelga e visualizzi da un array
di 10 immagini 4 immagini ma che non ce ne siano 2 uguali!!!
non č difficilissimo,ma mi pianto nell'assegnare il valore random!!!dovrei
crearlo x 4 volte e assegnarlo a 4 variabili.Come faccio????


Visto che e' un esercizio mi sembrerebbe stupido risolvertelo.
Partiamo con una domanda: chi ti ha chiesto di cercare valori random?
Da quello che dici ti e' stato solo chiesto di scegliere quattro 
immagini diverse.

 wrote in message
news:yi6Xb.5523$FJ6.1...@twister1.libero.it...

<html>
<head>
<script language="JavaScript1.2">
var primofile;
var secondofile;
var terzofile;
var quartofile;
function creatabella()
{
 var percorsofoto= new
Array("1.gif","2.gif","3.gig","4.gif","5.gif","6.gif","7.gig","8.gif","9.fig
","10.gif");
primofile=Math.floor(Math.random()*10);
secondofile=Math.floor(Math.random()*10);
terzofile=Math.floor(Math.random()*10);
quartofile=Math.floor(Math.random()*10);
while (primofile == secondofile |terzofile == secondofile
|quartofile==secondofile)
{
secondofile=Math.floor(Math.random()*10);
}
while (secondofile == terzofile | terzofile==primofile
|quartofile==terzofile)
{
terzofile=Math.floor(Math.random()*10);
}
while (quartofile == terzofile | quartofile==primofile
|quartofile==secondofile)
{
quartofile=Math.floor(Math.random()*10);
}
document.write (primofile+" "+secondofile + " " + terzofile + " "+
quartofile);
document.write ("<table>");
document.write ("<tr><td>" + "<img src='" + percorsofoto[primofile] + "'>"+
"</td>");
document.write ("<td>" + "<img src='" + percorsofoto[secondofile] + "'>" +
"</td>");
document.write ("<td>" + "<img src='" + percorsofoto[terzofile] + "'>"+
"</td>");
document.write ("<td>" + "<img src='" + percorsofoto[quartofile] + "'>" +
"</td></tr></table>");
}
</script>
</head>
<body onload='javascript:creatabella();'>
<input type='button' onClick='javascript:creatabella();'>
</body>
</html>
Bye

[supercut]
Vedo con piacere che sei d'accordo con me...
Comunque ti faccio notare che tu hai fatto un array di immagini tutte 
diverse. Se mettessi qualche "doppione" ti accorgeresti che ti sei 
preoccupato solo di prendere quattro numeri random diversi e non quattro 
immagini diverse.
E continuo a sconsigliare il numero random.


bye

 alternativo al random, 
Credo intendesse dire che tu ti preoccupi di discriminare unicamente
l'indice, ma questo non significa necessariamente "avere due immagini
diverse".
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
"When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)

 diverse".
certo , se nell'array metti dei nomi uguali, cosa non molto logica :)
Bye


 certo , se nell'array metti dei nomi uguali, cosa non molto logica :)
Non e' detto che l'array sia composto da elementi noti.
Ricorda che questo e' un esercizio scolastico. Quel che ci ha riportato
l'utente e':
"(..)scelga e visualizzi da un array di 10 immagini 4 immagini ma che non
ce ne siano 2 uguali".
Gli elementi dell'array potrebbero essere conosciuti o non, in quel caso il
tuo script non funzionerebbe. Andrea voleva semplicemente sottolineare
questo.
Chiusa parentesi Scartabelli :)
Per quanto mi riguarda invece, ho visto il tuo codice e mi pare poco
performante ed elegante il metodo in cui viene scelto un elemento da un
array in modo che non sia un duplicato.
Senza scrivere direttamente il codice, avrei optato per "estrarre" un
elemento dall'array, in modo che all'estrazione successiva esso non fosse
piu' fisicamente presente, quindi non sarebbe stati necessari controlli
aggiuntivi per le estrazioni successive.
N.B. Sto parlando del codice hai scritto, quindi sto esulando dalle note
che ha fatto Andrea.


 aggiuntivi per le estrazioni successive.
corretto, perň la sequenza non sarebbe mai direttamente casuale in quanto
avresti sequenze identiche, invece col mio metodo le sequenze sono
totalemente casuali e mai identiche (salvo il caso), e comunque con questa
tua soluzione , ritorno a Scartabelli, non potresti essere sicuro di
immagini diverse a meno che crei if nidificati molto ineleganti.
forse la cosa corretta era una funzione ricorsiva, o per ridurre il codice
il piu possibile un while una sola volta con un array dei numeri, ma non so
se sia fattibile , o comunque avere il risultato non so se sia facile.
Prova a postare un pezzo di codice magari.
Bye

 immagini diverse a meno che crei if nidificati molto ineleganti.
Alla fine del mio post ho detto:
"N.B. Sto parlando del codice hai scritto, quindi sto esulando dalle note
che ha fatto Andrea."
:)
In realta' implementare anche questo controllo e' una sciocchezza, ma
volevo rimanere attinente al codice che avevi scritto.
Volevo evitare di scrivere codice per il discorso sollevato da Andrea,  ma
tant'e' che l'hai scritto tu e che cmq se non ti scrivo qualcosa dubito che
riusciamo a comprenderci.
Questo e' quello che reputo poco elegante, funzionale e performante:
primofile=Math.floor(Math.random()*10);
secondofile=Math.floor(Math.random()*10);
terzofile=Math.floor(Math.random()*10);
quartofile=Math.floor(Math.random()*10);
while (primofile == secondofile |terzofile == secondofile
|quartofile==secondofile)
{
secondofile=Math.floor(Math.random()*10);
}
while (secondofile == terzofile | terzofile==primofile
|quartofile==terzofile)
{
terzofile=Math.floor(Math.random()*10);
}
while (quartofile == terzofile | quartofile==primofile
|quartofile==secondofile)
{
quartofile=Math.floor(Math.random()*10);
}
Vedi anche da solo che non e' un bel codice: Solo se hai un immensa fortuna
becchi 4 indici diversi, altrimenti ti fai un numero ignoto a priori
finche' non li trovi.
Inoltre, se tu dovessi modificare lo script per ottenere solo tre
variabili? O aggiungerne un paio? Oppure invece di 10 elementi ne hai 4? o
12? Devi riscrivere praticamente tutte le condizioni. Sostanzialmente il
codice e' poco flessibile e manutenibile.
Quello che intendevo io era qualcosa di questo tipo:
function getPhoto(){
	return
percorsofoto.splice(Math.floor(Math.random()*percorsofoto.length),1);
}
 
var percorsofoto= new
Array("1.gif","2.gif","3.gig","4.gif","5.gif","6.gif","7.gig","8.gif","9.f
ig","10.gif");
 
var	firstphoto=getPhoto(),
	secondphoto=getPhoto(),
	thirdphoto=getPhoto(),
	fourthphoto=getPhoto();
Generalizzando maggiormente:
Array.prototype.extract=function(index){
	index=index||Math.floor(Math.random()*this.length);
	return this.splice(index,1);
}
var percorsofoto= new
Array("1.gif","2.gif","3.gig","4.gif","5.gif","6.gif","7.gig","8.gif","9.f
ig","10.gif");
 
var	firstphoto=percorsofoto.extract(),
	secondphoto=percorsofoto.extract(),
	thirdphoto=percorsofoto.extract(),
	fourthphoto=percorsofoto.extract();



certo la funzione splice ti leva un elemento dell'array e ti rende la vita
molto più facile e il codice è molto pratico, comunque non credo che fosse
questo lo scopo dell'esercizio, piuttosto quello di effettuare i vari
controlli smanettando sul codice nel modo più pratico possibile confrontando
i valori.
E comunque resta per il fine richiesto il tuo un metodo molto azzeccato.
Bye

 i valori.
Il testo dell'esercizio era:
"attraverso script creare una tabella che scelga e visualizzi da un array
di 10 immagini 4 immagini ma che non ce ne siano 2 uguali!!!"
Ergo uno e' libero di usare il metodo che piu' gli aggrada e reputa il
migliore.
Se in caso contrario, come in molti altri esercizi, fosse stato specificato
di che istruzioni far uso, oppure una linea guida, sarei stato d'accordo
con te; ma almeno da quanto e' possibile leggere dal post non e' questo il
caso.
Quindi ho semplicemente scritto una delle soluzioni che, a mio avviso, e'
tra le migliori per questo genere di problema.
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
"Questa e' una lezione difficile, ma importante: Cio' che e' stato, e cio'
che sara', non cambia cio' che e'.
Sta a te decidere poi come prendere questa cosa,se logorarsi per un passato
che non puoi cambiare, invece di prendere tutto il bene che il presente ti
offre." ()


io ne ho pensata un'altra che non usa vigliaccamente funzioni gia
implementate dal motore javascript.
<script language="JavaScript">
var fototemp=1;
var percorsofoto= new
Array("1.gif","2.gif","3.gig","4.gif","5.gif","6.gif","7.gig","8.gif","9.fig
","10.gif");
var percdistinct=new Array(percorsofoto.length);
percdistinct[0]=percorsofoto[numcas()];//la prima votla per forza
function getPhoto(){
var valcandidato=percdistinct[0];
 while(((percdistinct.join()).indexOf(valcandidato, 0))!=-1)
{valcandidato=percorsofoto[numcas()];}
percdistinct[fototemp]=valcandidato;
fototemp++;
}
function numcas()
{return Math.floor(Math.random()*percorsofoto.length);}
function vedi()
{
 getPhoto();getPhoto();getPhoto();getPhoto();
alert(percdistinct[0]);
alert(percdistinct[1]);
alert(percdistinct[2]);
alert(percdistinct[3]);
}
--></script>
bye

 {return Math.floor(Math.random()*percorsofoto.length);}
Ehy. Guarda che stai usando delle funzioni gia' implementate
"vigliaccamente" dal motore javascript. Il floor ed il random.
Per non parlare dell'intero oggetto Math. ;)
Dai. Torna serio.



CUT

 ti volevo sollazzare mi piace trovare soluzioni sempre piů ottimali.:)
Una soluzione ottimale e' gia' stata trovata. Se vuoi farti del male
trovando soluzioni meno performanti e poco eleganti, fai pure :) Ma ci sono
modi migliori, a mio avviso, per passare il tempo. ;)


 implementate dal motore javascript.
Io ne ho un' altra, fatta tempo fa, ancora piu` cervellotica:
 ,---- [ C:\gfCsoft\PROVA\a9.htm ] 
| <html>
| <head>
| <script language="JavaScript">
| function gfC_numCasuali(){
|     var gfC_aA=[],gfC_aX=[],gfC_cA=0,gfC_cB=0,gfC_aL=0,gfC_cQ=(arguments[2]?(arguments[0].length-arguments[2]):0);
|     if(arguments[1])while(gfC_cA<=arguments[1])gfC_aA[gfC_cA]=arguments[0]+(gfC_cA++)
|          else gfC_aA=arguments[0];gfC_cA=gfC_aA.length
|     while(gfC_cA>gfC_cQ){
|         gfC_cB=Math.floor(Math.random()*gfC_cA);gfC_aL=gfC_aA[gfC_cB];
|         gfC_aA[gfC_cB]=gfC_aA[--gfC_cA];gfC_aA[gfC_cA]=gfC_aL;gfC_aX[gfC_cA-gfC_cQ]=gfC_aL;
|     }
|     return gfC_aX;
| }
| alert(gfC_numCasuali(["0","1","2","3.gif","4","5","6","7","8","9"],false,3))
| alert(gfC_numCasuali(22,5,false))
| </script>
| </HEAD>
| </body>
| </html>
 `----
-- 
Ciao  [da casa]
  [web]  
www.gfcarlotti.it
 
    [mail]  text welcome in Reply-To
      [pgp]  
www.gfcarlotti.it/pgp/franco.asc

 manutenzione, e riusabilita'..?
Me tapino, ho ancora installato IE5, e non funzia *splice*


 Me tapino, ho ancora installato IE5, e non funzia *splice*
Non e' colpa di IE5, ma dello script engine; basta aggiornare quello.
Anche se io aggiornerei anche il browser. IE5.x ha tutta una serie di bug
da JScript ai CSS che la meta' basta. Mi stupisco che qualcuno lo usi
ancora.
Tra l'altro, mi meraviglio Giancarlo. Se lo splice non e' supportato (e ti
ricordo che lo supporta addirittura NS4.x, fai un po' te), emularlo e' di
una semplicita' unica, tramite il prototype. :)
if (typeof Array.prototype.splice=="undefined"){
	Array.prototype.splice=function(){
	:
	:
	}
}
In questo modo non devi preoccuparti dopo se e' supportato nativamente o
meno.
Difatti e' cosi' che ho sempre fatto io, e che generalmente si dovrebbe
fare per qualsiasi features supportata dalla maggior parte dei browser.
Se supportata, usarla. Nei rari casi in cui non e' supportata, emularla. In
questo modi prendi i benefici laddove puoi farlo, senza sacrificare nulla.
Un po' come la filosofia delle schede acceleratrici 3D. :)
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
"When you have eliminated the impossible, whatever remains,


 come soluzione.
Come ti ha detto Zer0: non sai la natura dell'array. O perlomeno, da 
quanto ha riportato karma, non parrebbe noto.
Per milioni di motivi potremo ritrovarci un array con dei duplicati, 
come non siamo certi di avere per forza almeno quattro immagini diverse.
Per questo (oltre che per il motivo dell'esercizio) invitavo karma ad 
approfondire: sei sicuro che ti vengano richieste immagini diverse di 
volta in volta? O magari semplicemente ti chiedono quattro immagini 
diverse tra loro e punto?
Dopodiche', per quanto riguarda la questione numero random o no, avrai 
certamente notato che un computer non e' proprio bravo a generare numeri 
casuali: tende con molta facilita' a ripetersi.
Sottoponendo la ricerca a dei cicli come hai fatto tu rischi di avere 
cicli ridondanti e, dato che siamo in un linguaggio di scripting, 
probabili loop.
E' quindi conveniente considerare una grandezza variabile (data in 
millisecondi) e con un qualche semplice algoritmo desumere le grandezze 
di cui abbiamo bisogno.

 di cui abbiamo bisogno.
Che e' esattamente quel che fa il random, eh. :) E' un semplice algoritmo
che parte da una grandezza variabile (seme) che per default e' la data in
millisecondi.
Certo, e' possibile scrivere un algoritmo di generazione numeri pseudo
casuali differente da quello implementato nell'oggetto Math. Ricordo una
volta un mio ex compagno di scuola, che fece la stessa cosa in Pascal, dato
che considerava poco vario quello delle librerie standard.
Nulla vieta di fare altrettanto in JS, anche se il migliore algoritmo di
generazione numeri pseudo casuali di cui abbia letto all'epoca, non e'
implementabile in Javascript (deve avere accesso alle risorse HW della
macchina.. fa un interessante giochetto).
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
"Questa e' una lezione difficile, ma importante: Cio' che e' stato, e cio'


 millisecondi.
Ovviamente.
Magari mi sono spiegato male: dicevo che isolando il tuo problema riduci 
e "piloti" le casistiche, invece di affidarsi ad un algoritmo "generico".

>>Chiedo venia se non ho saputo spiegarmi bene,ma allo stesso tempo mim fa
piacere che la discussione si sia sviluppata così a fondo.In raltà nella
tabella devono apparire 4 immagini diverse tra loro!Se poi al refresh della
pagina si ripresentassero anche 3 su 4 delle immagini precedenti non ha
importanza!Del resto non cercavo soluzioni stratosferiche,ma essendo agli
inizi,volevoche mi aiutaste a fare uno schema mentale di come procedere,un
diagramma di flusso della funzione che usasse i pochi strumenti che abbiamo
usato sin d'ora!es Math.random,condizioni,cicli e array.
-- 
-._.--._.--._.--._.--._.--._.--._.--._.--._.--._.--._.--
Fratelli: ciò che facciamo in vita riecheggia nell'eternità

 una semplicita' unica, tramite il prototype. :)
Certo, io l' avevo data come *notizia*.
^____^


 usato sin d'ora!es Math.random,condizioni,cicli e array.
Appurato questo non hai alcun bisogno della funzione random.
Devi solo memorizzare i valori che scegli dall'array iniziale per poter 
fare un semplice confronto: "se l'ho gia' scelto passo al prossimo e 
continuo finche' non ho quattro immagini o non e' finito l'array".