Newsgroup: it.comp.java
Titolo: Algoritmo controllo numeri casuali.

Ciao, devo riempire un array di 6 elementi con dei numeri fino a 90, tenendo
d'occhio che in un elemento dell'array non ci finisca un numero già uscito.
E' giusto l'algoritmo qui sotto, che rappresenta una generalizzazione del
problema?
a[0]=f(y);
for(int i=1;i<a.length;i++){
    int exp=f(y);
    for(int j=i-1;j>0;j--){
        int tmp=exp;
        if(a[j]!=tmp)
            a[j]=tmp;
    }
}
dove a[] è un array di tipo int di 6 elementi che deve contenere interi
positivi tra 1 e 90 (la sestina del sup.)
e dove f(y) è il metodo nextInt della classe Random.

Di getto mi č venuto in mente questo. Non so se č giusto.
  boolean flag=true;
  for(int i=1;i<a.length;i++){
    do{
      int exp=f(y);
      if(i>0){
          for(int j=0;j<i;j++){
              if(a[j]==exp)
                  flag=false;
          }
      }
      if(flag) a[i]=exp;
    }while(!flag)
  }


Sempre a braccio:
int i=0
while (i<6)
{
int num= numero causale;
if (check(num,i))
    {
    a[i]=num;
    i=i+1;
    }
}
dove il check controlla la validità del numero:
Lo puoi fare con un for che scorre l'array fin qui generato, oppure con un
while è piu o meno identico in questo caso.
boolean check(int num,int i)
{
boolean buono=true;
for (int j=0;j<i;j++)
     if (num==a[j])
        buono=false;
return buono;
}
In java per il numero random puoi usare
int num= (int) (Math.Random()*90+1);

   boolean flag=true;
   for(int i=1;i<a.length;i++){
     do{
       int exp=f(y);
       if(i>0){
           for(int j=0;j<i;j++){
               if(a[j]==exp)
                   flag=false;
           }
       }
        if(flag) a[i]=exp;
     }while(!flag || (j==i-1))
    }

 int num= (int) (Math.Random()*90+1);
Infatti, in classe abbiamo poi scritto int num=1+r.nextInt(90); dove r= new
Random();
Ecco un'altra soluzione che ho trovato, modificando il mio:
int counter=0;
a[0]=f(y);
for(int i=1;i<a.length;i++){
    int exp=f(y);
    for(int j=i-1;j>0;j--){
        int temp=exp;
        if(a[j]!=temp)
            counter++;
    }
    if(counter==ì)
        a[j]=temp;
    counter=0;
}
Che ne dite di così? Ho la febbere e l'influenza..e sono le
due.......scusate se ho sbagliato.
Buona notte e grazie ^__^

 while
......adesso ho capito ...puņ anche succedere che ne devo generare cento
(non si puņ mai dire)..ecco che allora a.length non va bene..
Grazie ehehe.

 ha scritto nel messaggio
news:4vYa8.21581$tv6.6...@twister1.libero.it...

ho capito...oggi a scuola (se ci vado) ne discuto.
Grazie ^_^

 wrote:

Ciao,
provo anch'io a suggerirti un algoritmo un po' piu' efficiente (soprattuto
nel caso in cui i numeri da estrarre non siano solo 6):
int numbers[] = new int[90];
for (int i=0; i < 90; i++) {
    numbers[i] = i+1;
}
java.util.Random r = new java.util.Random(); int a[] = new int[6];
for (int i=0; i < 6; i++) {
    int j = r.nextInt(89-i);
    a[i] = numbers[j];
    numbers[j] = numbers[89-i];
}
..parametrizzandolo un po', in modo che si possa cambiare facilmente il
range di valori da cui estrarre, ed il numero di valori da estrarre:
int numOfValues = 6; // must be 0<numOfValues<rangeSize int rangeMin = 1;
int rangeMax = 90;
int rangeSize = rangeMax-rangeMin+1;
int numbers[] = new int[rangeSize];
for (int i=0; i < rangeSize; i++) {
    numbers[i] = rangeMin+i;
}
java.util.Random r = new java.util.Random(); int a[] = new
int[numOfValues];
for (int i=0; i < numOfValues; i++) {
    int j = r.nextInt(rangeSize-i-1);
    a[i] = numbers[j];
    numbers[j] = numbers[rangeSize-i-1];
}
Un saluto
  Lucio
-- 
Lucio Benfante
Brainbench MVP for Java 1
http://www.brainbench.com

 generalizzazione del problema?
Mah, e' vagamente piu' facile usare una Collection:
Set s = new HashSet();
while(s.size()<6) s.add(new Integer(random.nextInt()));
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun

 
Dimenticavo, poi, ovviamente converti in array con toArray() o un unico 
ciclo su un iterator del Set.


}
[CUT]
Il tuo codice, fa una cosa diversa da quello che leggo nelle parole di 
songohan.
E' la prima cosa che è venuta in mente anche a me, ma lui non chiedeva 
che i numeri casuali (nel range 1-90) fossero unici.
L'ho pensato anch'io, soprattutto per il *90*: si parla forse di 
tombola/bingo??
Stavo infatti per suggerirgli di leggersi l'esempio del Bingo sul 
Tutorial che, per l'estrazione dei numeri (ma non per la costruzione 
delle cartelle), adotta un metodo analogo a quello che hai proposto tu 
(e non ne vedo altri "ragionevoli" :-).
Ho detto la mia ;-)
-- 
Ciao
	Fabrizio C.

 ciclo su un iterator del Set.
Beh, grazie...ma le Collection ancora non le abbiamo fatte :))
Grazie a tutti, mi studierò il vostro codice ^__^
Ciao.

 wrote:

Boh...a me pare che "devo riempire un array di 6 elementi con dei numeri
fino a 90,tenendo d'occhio che in un elemento dell'array non ci finisca un
numero già uscito." voglia dire proprio che i numeri casuali estratti non
devono ripetersi. sara' che non capisco piu' l'italiano.
Ciao


sara' che non capisco piu' l'italiano.
No, no. Sono io che spesso farei meglio a fare una passeggiata invece 
di scrivere cretinate senza leggere attentamente.
Sorry.
-- 
Ciao
	Fabrizio C.

 wrote:

OK...scusato.
Buona passeggiata! ;-)
