PDA

Visualizza la versione completa : Ottenere tre numeri random diversi fra loro


Graziano
24-09-2006, 17:29
Salve a tutti,
Avrei bisono di ottenere tre numeri casuali compresi tra 1 e il valore di una variabile (che potrebbe essere > 8 e < di 15).
Ma i tre numeri random devono essere diversi fra loro.

con:

$numero[0] = int(rand $numeroMAX) + 1 ;
$numero[1] = int(rand $numeroMAX) + 1 ;
$numero[2] = int(rand $numeroMAX) + 1 ;

rischio molto spesso di avere dei valori identici, mentre a me servono univoci.

Come posso fare ?

shishii
24-09-2006, 19:50
le probabilità sono parecchie.

In questi casi in genere è più comodo usare degli hash al posto dell'array:


ad esempio:
my %numero;

for ($i = 0; $i <= 2; $i++) {
while (1) {
$random = int(rand $numeroMAX) + 1;
if (! exists $numero{$random}) {
$numero{$random} = '';
last;
}
}
}

Graziano
24-09-2006, 21:35
Ciao Shishi,
Scusa ma non ho capito bene il tuo esempio.
Me lo puoi spiegare meglio?
Per funzionare funziona, solo che non lo capisco, sarà perchè i cicli for e wile non mi entrano in testa (li uso pochissimo).

shishii
25-09-2006, 20:33
# inizializzo l'hash
my %numero;

# effettuo un ciclo che creerà un hash di tre elementi
# puoi regolare le dimensioni agendo sull'istruzione di for
# $i <= x dove x è la dimensione che ti serve - 1

for ($i = 0; $i <= 2; $i++) {

# inizio un ciclo, teoricamente infinito, per generare i numri casuali
while (1) {

# genero il numero casuale
$random = int(rand $numeroMAX) + 1;

# verifico che non sia un doppione
if (! exists $numero{$random}) {

# se non è un doppione creo l'elemento dell'hash
# che ha il numero casuale come key e 'nulla' come valore
$numero{$random} = '';

# se non è un doppione esco dal ciclo while
# altrimenti ripeto le operazioni, fino a che non viene
# generato un numero casuale non doppio.
last;
}
}
}

Graziano
27-09-2006, 20:09
Mmmh !

Adeso mi sembra più chiaro !
Grazie.

Loading