Visualizzazione risultati 1 fino 17 di 17

Discussione: random in base a percentuale

  1. #1
    Guest

    Predefinito random in base a percentuale

    Salve a tutti, devo simulare un risultato in base alla % di probabilità, almeno vorrei fare che mi assegnasse un numero da 1a3 però questo numero in base alla %
    es:
    1- deve uscire con la probabilità dell' 60%
    2- deve uscire con la probabilità dell' 15%
    3- deve uscire con la probabilità dell' 25%

    questo è almeno il minimo, se è possibile vorrei proprio il risultato, estrae sempre un numero da 1a3 ma ogni volta che esce la variabile aumenta di 1 fino al max 4
    GRAZIE A TUTTI

  2. #2
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito

    Bhe.. con la normale funzione rand() del php non credo tu possa farlo, per quando riguarda le probabilità, ma puoi mettere tutti i numeri in un'array, l'array potrà essere ad esempio formata in questo modo:

    Codice PHP:
    $array = array(1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3);
    Al questo punto recuperi un valore casuale dall'array mediante la funzione array_rand() del php.

    Non ne sono sicuro ma credo che con questo metodo, visto che in array ci sono dieci 1, due 2, e quattordici 3 il valore 1 dovrebbe avere il 10% di probabilità che esce, il 2 il 2%, mentre il 3 il 14%.

    Bhe.. seguendo la logica dovrebbe essere cosi, ma non saprei.

    Sevenjeak
    Software developer and much more

  3. #3
    Guest

    Predefinito

    ma le probabilità sono sempre diverse non sono fisse

  4. #4
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito

    Se non sono fisse potreste partire da un'array vuota e popolarla, ogni volta in modo diverso, a secondo del variare delle probabilità, oltre alle array non so in che altro modo potresti fare, sempre se quello dovrebbe andare bene, visto che non lo provato, potresti, se è utile, specificare come variano le probabilità?
    Ultima modifica di sevenjeak : 09-06-2012 alle ore 11.59.27

    Sevenjeak
    Software developer and much more

  5. #5
    Guest

    Predefinito

    le probabilità variano in base alla squadre estratte

  6. #6
    L'avatar di sevenjeak
    sevenjeak non è connesso AlterGuru
    Data registrazione
    25-10-2007
    Residenza
    Roma
    Messaggi
    1,767

    Predefinito

    Dovresti memorizzare queste probabilità da qualche parte per poi utilizzarle per popolare l'array, o ancora meglio per ogni squadra memorizzi una piccola array, se ad esempio una squadra a il 2% di probabilità l'array dovrebbe essere cosi:

    Codice PHP:
    array(nome_squadra, nome_squadra)
    Alla fine potresti recuperare tutte le array per unirli e formare un'unica array sul quale estrai un valore casuale, tramite la funzione da me postata.

    Purtroppo non ho nessun esempio da postarti, ma ti ho scritto due metodi che secondo me potresti usare, ora sta a te decidere quale metodo usare.

    Sevenjeak
    Software developer and much more

  7. #7
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Troppo macchinoso, nonché dispendioso di risorse.
    Molto più semplicemente: genera un numero casuale compreso tra zero e uno (uno escluso, zero compreso) e memorizzalo in una variabile. Inizializza un'altra variabile con il primo valore rappresentante con quale probabilità può uscire, espressa però non in percentuale ma con un numero compreso sempre tra zero e uno. Prendi questa variabile e confrontala con il numero casuale appena generato, il numero casuale è minore? Se sì allora fai uscire come opzione quella appena presa in considerazione, altrimenti incrementa la seconda variabile (quella non casuale) della probabilità con cui può uscire la successiva opzione (sempre espressa mediante un numero tra zero e uno) e ripeti il controllo.

    Probabilmente è persino possibile fare a meno della seconda variabile.

  8. #8
    Guest

    Predefinito

    Raga, rispondete è urgente sto provando a riempire gli array in questo modo solo che m da l'errore: Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 24 bytes) in line 16

    Codice PHP:
    $q1=7;
    $qx=1;
    $q2=2;
    $risultato=array();
    $e=0;

    while(
    $e<$q1)
    {
    array_push($risultato,1);// riga 16
    }
    $e=0;
    while(
    $e<$qx)
    {
    array_push($risultato,2);
    }
    $e=0;
    while(
    $e<$q2)
    {
    array_push($risultato,3);
    }
    Ultima modifica di dreadnaut : 17-06-2012 alle ore 16.03.20 Motivo: + tag [php]

  9. #9
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Hai provato a seguire i miei suggerimenti?

  10. #10
    Guest

    Predefinito

    non ho capito molto

  11. #11
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Risposta al post #8: ci credo che vada a sfondare la capacità di memoria, stai continuando ad aggiungere elementi ad un array senza però modificare nel ciclo quella che può essere la condizione di arresto (in altre parole, $e rimane sempre minore di $q1, e nel ciclo non fai nulla perché questo non accada più e arrestare il ciclo stesso).

    Risposta al post #1: prima il codice
    Codice PHP:
    <?php
    $esiti
    = array (
    'caso1' => 0.60,
    'caso2' => 0.75, // 0.60 + 0.15
    'caso3' => 1.00 // 0.60 + 0.15 + 0.25
    );

    $rnd = 1.0 * rand() / getrandmax();

    foreach (
    $esiti as $k => $v)
    {
    if (
    $rnd <= $v)
    {
    echo
    $k;
    break;
    }
    }
    ?>
    Spiegazione: nell'array $esiti devi definire i singoli eventi come chiavi e come valori la rispettiva "probabilità cumulata" (in pratica, la probabilità del singolo evento sommata a tutti i casi precedenti). Poi generi un numero casuale (che nella forma soprascritta sarà un decimale compreso tra 0 e 1), e quindi scandisci, una alla volta, le chiavi e i valori: al primo valore che trovi minore o uguale della soglia, stampi il risultato (e arresti il ciclo, altrimenti proseguirebbe a stampare tutti gli altri).

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  12. #12
    Guest

    Predefinito

    preferisco usare questo che ho fatto io e quindi capito molto meglio, ho stampato l'array e viene popolato giustamente(1,1,1,1,1,1,1,2,3,3) però quando estraggo un elemento casuale con array_rand mi stampa numeri che nell'array non ci sono non e che stampa l'indice? AIUTOO!!!! GRAZIE

    Codice PHP:
    $q1=7;
    $qx=1;
    $q2=2;
    $q1=number_format( $q1, 0);
    $qx=number_format( $qx, 0);
    $q2=number_format( $q2, 0);
    $risultato=array();
    $e=0;

    while(
    $e<$q1)
    {
    array_push($risultato,1);
    $e=$e+1;
    }
    $e=0;
    while(
    $e<$qx)
    {
    array_push($risultato,2);
    $e=$e+1;
    }
    $e=0;
    while(
    $e<$q2)
    {
    array_push($risultato,3);
    $e=$e+1;
    }

    echo
    array_rand($risultato,1);
    Ultima modifica di dreadnaut : 17-06-2012 alle ore 16.03.53 Motivo: + tag [php]

  13. #13
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Citazione Originalmente inviato da sinopoli Visualizza messaggio
    ... però quando estraggo un elemento casuale con array_rand mi stampa numeri che nell'array non ci sono non e che stampa l'indice?
    È proprio così, ma puoi usare l'indice trovato per scrivere l'elemento (guarda il codice di esempio sulla documentazione).

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  14. #14
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,269

    Predefinito

    (preceduto) Magari si, dovresti leggere la documentazione di array_rand(), prima di usarla.

    Fra parentesi, quello che stai cercando di fare si chiama roulette wheel selection, e si fa sommando le probabilità come suggeriva Karl sopra.

    In breve, se hai un array di probabilità (quindi valodi da 0 a 1) chiamato prob, selezioni un elemento così:

    Codice:
    x   = rand(0,1)
    sum = 0
    
    foreach (prob as i => p)
      sum += p;
      if x < sum
        seleziona l'elemento i-esimo
    Ultima modifica di dreadnaut : 17-06-2012 alle ore 16.15.26 Motivo: + algo

  15. #15
    Guest

    Predefinito

    Adesso questo array devo passarlo all'altra pagina e per far ciò utilizzo l'input type hidden
    ma nn riesco proprio a farlo andare ho guardato un casino di forum ho provato tutte le soluzioni ma niente non va. AIUTOOO!!!! è urgente GRAZIE

    codice (partite.php):
    Codice PHP:
    <form action="schedina.php" method="POST">
    <?php
    $stringa2
    ="SELECT nome_squadra FROM campionatisquadre WHERE (nome_campionato='{$_GET['campionato']}') ORDER BY RAND() LIMIT 0,$c;";
    $ris2=mysql_query($stringa2);
    $x=1;$r=0;
    $resto;
    while(
    $riga2=mysql_fetch_array($ris2))
    {
    $resto=$x%2;
    echo
    $riga2[0];
    if(
    $resto!='0' || $x==1)
    {
    echo
    ' - ';
    //query
    else
    {
    //query
    $quota1=100/((($vitcasa+$sconftrasf)/($sompcasa+$somptrasf))*100);
    $quotax=100/((($parcasa+$partrasf)/($sompcasa+$somptrasf))*100);
    $quota2=100/((($scocasa+$vittrasf)/($sompcasa+$somptrasf))*100);
    $quota1=number_format( $quota1, 2);
    $quotax=number_format( $quotax, 2);
    $quota2=number_format( $quota2, 2);
    $q1=(($vitcasa+$sconftrasf)/($sompcasa+$somptrasf))*100;
    $qx=(($parcasa+$partrasf)/($sompcasa+$somptrasf))*100;
    $q2=(($scocasa+$vittrasf)/($sompcasa+$somptrasf))*100;
    $q1=number_format( $q1, 0);
    $qx=number_format( $qx, 0);
    $q2=number_format( $q2, 0);
    $risultato=array();
    $e=0;

    while(
    $e<$q1)
    {
    array_push($risultato,1);
    $e=$e+1;
    }
    $e=0;
    while(
    $e<$qx)
    {
    array_push($risultato,2);
    $e=$e+1;
    }
    $e=0;
    while(
    $e<$q2)
    {
    array_push($risultato,3);
    $e=$e+1;
    }
    $i=array_rand($risultato,1);
    $i=$risultato[$i];
    $risultati=array();
    if(
    $i=='1')
    array_push($risultati,$quota1);
    else if(
    $i=='2')
    array_push($risultati,$quotax);
    else
    array_push($risultati,$quota2);

    echo
    "<pre>$quota1<input type='radio' name='".$r."' value='".$quota1."'/> $quotax<input type='radio' name='".$r."' value='".$quotax."'/> $quota2<input type='radio' name='".$r."' value='".$quota2."'/></pre>";

    $r=$r+1;
    }
    $x=$x+1;
    }
    echo
    "Quanto vuoi scommettere:<input type='text' name='p'>euro<br>";

    ?>
    <br><input type="hidden" name="r" value="<?php echo $r; ?>">
    <input type="hidden" name="array" value='<?php printf(serialize($risultati)); ?>'>
    <input type="submit" value="Conferma"><br>
    <a href="index.php">torna alla Home page</a>
    </FORM>
    </BODY>
    </HTML>
    codice(schedina.php)
    Codice PHP:
    <?php
    $risultati
    =unserialize($_POST['array']);
    echo
    $risultati[3];//nn esce niente
    Ultima modifica di dreadnaut : 17-06-2012 alle ore 19.50.50 Motivo: +tag [php]

  16. #16
    Guest

    Predefinito

    Ho trovato il problema sta qua:

    Codice PHP:
    $risultato=array();
    $e=0;

    while(
    $e<$q1)
    {
    array_push($risultato,1);
    $e=$e+1;
    }
    $e=0;
    while(
    $e<$qx)
    {
    array_push($risultato,2);
    $e=$e+1;
    }
    $e=0;
    while(
    $e<$q2)
    {
    array_push($risultato,3);
    $e=$e+1;
    }
    $i=array_rand($risultato,1);
    $i=$risultato[$i];
    $risultati=array();
    if(
    $i=='1')
    array_push($risultati,$quota1);
    else if(
    $i=='2')
    array_push($risultati,$quotax);
    else
    array_push($risultati,$quota2);
    il problema è che nell'array $risultati mi scrive sempre nella posizione 0 come mai?
    Ultima modifica di dreadnaut : 18-06-2012 alle ore 13.41.39 Motivo: + tag [php]

  17. #17
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,247

    Predefinito

    Perché $risultati è vuoto, quindi $quota1, $quota2 o $quotax te lo mette giustamente nell'indice 0.

    Ciao!

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •