Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Ottenere tre numeri random diversi fra loro

    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 ?

  2. #2
    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;
    }
    }
    }
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  3. #3
    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).

  4. #4
    # 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;
    }
    }
    }
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  5. #5
    Mmmh !

    Adeso mi sembra più chiaro !
    Grazie.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.