Domanda:
Chi ne capisce di programmazione in java? domandina molto semplice!?
anonymous
2011-02-09 13:14:51 UTC
Vorrei generare dei numeri casuali da 1 a 10 che vengono stampati col metodo syste.print ecc... Ed utilizzo Math.random per creare i numeri... Però, vorrei che quando un numero esce non può più uscire.... ad esempio se esce il due, poi non piò più uscire il 2.. Deve essere escluso dai numeri! Come faccio?=
Tre risposte:
anonymous
2011-02-09 13:54:23 UTC
Ale ti ha dato un'idea, ma in effetti andare a controllare di volta in volta tutto l'array è estremamente penalizzante!



Ci sono fondamentalmente 2 algoritmi per generare numeri random senza ripetizione, quello che usa Ale è quello meno efficiente e funziona così:



Supponi di generare un numero casuale tra 1 e 90.



* E' già stato selezionato? Se sì vai avanti, se no generane un altro.



Adesso supponi di aver già generato i numeri da 1 a 89 e manca solo il 90... Generi un numero, è già uscito, generi un altro numero, è già uscito, generi un altro numero, è già uscito... Finché non generi il 90 !!



Questo, teoricamente, potrebbe continuare all'infinito.



- - - - - - - - - - - - - - - - - - - - - - - -



L'Algoritmo Efficientissimo (miscelatore) invece funziona così:



1) Riempi un vettore (1..N) con i valori 1, 2, 3, ..., N ( ovvero v[1]=1; v[2]=2; v[n]=n; )

2) MESCOLA il vettore

3) Restituisci, uno alla volta i numeri presenti nel vettore, dal primo all'ultimo :)





Punto 1:



VET[1 to N] : intero;

FOR I=1 TO N

.....VET[I]=I;



Punto 2:



FOR I=1 TO N

.....FOR J=1 TO N

..........A = RANDOM ( 1, N )

..........B = RANDOM ( 1, N )

..........SCAMBIA ( A, B )



Punto 3:



FOR I=1 TO N

.....Scrivi VET[I]
BluNotte
2011-02-09 17:46:18 UTC
import java.util.ArrayList;

import java.util.Random;

import java.util.Arrays;



class prova {

public static void main(String[] args) {

ArrayList sacco = new ArrayList(Arrays.asList(new Integer[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}));

Random r = new Random();



while (!sacco.isEmpty())

System.out.print(sacco.remove(r.nextInt(sacco.size())) + " ");

}

}



Qui trovi la stessa cosa, un po' più leggibile: http://pastebin.com/rwvwWfAA



PS: Ti confermo che l'algoritmo del miscelatore, proposto nella risposta precedente, è decisamente più efficiente. Ma dovresti implementarlo tu, mentre la mia soluzione sfrutta solo la libreria java. Inoltre, per solo 10 numeri, la differenza è sostanzialmente nulla.
Ale
2011-02-09 13:22:08 UTC
Non so se in java esiste una classe che ti fa sto lavoro, io in c mi ricordo che salvavo ogni valore in un array, e poi ad ogni estrazione casuale lo controllavo tutto, e ripetevo finché non trovavo un valore non presente nell'array. E' un metodo un pò goffo, forse in java c'è di meglio...però funziona!

Ciao :)


Questo contenuto è stato originariamente pubblicato su Y! Answers, un sito di domande e risposte chiuso nel 2021.
Loading...