1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

PHP Probalidades

Discussão em 'Web Development' iniciada por DarkWolfXP, 2 de Abril de 2008. (Respostas: 26; Visualizações: 1538)

  1. DarkWolfXP

    DarkWolfXP Power Member

    Boas, estou neste momento a desenvolver um script que necessita de probabilidades.
    Eu neste momento estava a utilizar a função rand();, que seleciona numeros de um determinado intervalo com igual probalidade...
    Eu gostaria de saber se com essa função ou com outra que exista será possivel aumentar ou diminuir a probalidade de um numero sair?
    Cumps
     
  2. malato

    malato Power Member

    A resposta é sim. Dá para resolveres o problema se o olhares de uma maneira ligeiramente diferente.
    Se fazes um random para te sair um número entre x e y todos os números nesse intervalo têm a mesma probabilidade de sair (teoricamente).

    Agora imagina que o meu intervalo de números possíveis é de 1 a 5. Quero que os primeiro 4 tenham a mesma probabilidade de sair. E quero que o número 5 tenha 3 vezes mais probabilidade de sair.

    Então é simples: Basta-me fazer um random de 1 a 7 e fazer a correspondência entre o número que calha e o número a devolver da seguinte forma:
    Se sair 1 -> 1
    Se sair 2 -> 2
    Se sair 3 -> 3
    Se sair 4 -> 4
    Se sair 5 -> 5
    Se sair 6 -> 5
    Se sair 7 -> 5
     
  3. hostmake

    hostmake Power Member

    PHP:
    <?php

    $numero_probabilidades 
    20;
    $primNum 1;
    $ultNum 20;
    $percentagem_aldrabar 0.32//32%
    $numero_aumentar_probabilidade 8;
    $inteiro_aldrabar intval($numero_probabilidades $percentagem_aldrabar);

    for (
    $i 1$i <= $numero_probabilidades$i++)
        
    $probabilidades[] = rand($primNum$ultNum);

    for (
    $i 1$i <= $inteiro_aldrabar$i++)
        
    $probabilidades[$numero_aumentar_probabilidade+$i] = $numero_aumentar_probabilidade;

    ?>
     
  4. DarkWolfXP

    DarkWolfXP Power Member

    Obrigado pelas repostas ;), experimento isso amanha assim que puder

    Cumps
    P.S: N é para aldrabar :007:, é mm para aumentar a probalidade do numero que deveria sair para os utilizadores ;).
     
  5. MPalhas

    MPalhas Power Member

    uma maneira que eu não sei se já cheguei a usar, mas pelo menos pensei :p

    por exemplo, se quiseres um random assim:
    1: 30% de prob
    2: 25% de prob
    3: 25% de prob
    4: os restantes 20%

    Código:
    $x=rand(1, 100)
    if (x<=30)
      $resposta=1;
    else if ($x<=55)
      $resposta=2;
    else if ($x<=80)
      $resposta=3;
    else
      $resposta=4;
    
    eu sei, nao e grande coisa, mas foi o que me lembrei na altura...:rolleyes:
    nao vi muito bem esse código do hostmake, mas deve ser melhor que o meu.
     
  6. DarkWolfXP

    DarkWolfXP Power Member

    Tá a bombar :003:, obrigado a todos ;)
    agr suscitou-me um problema

    Tenho um sistema de lotaria, tenho bilhetes limitados, e quero que cada bilhete tenha um numero unico eu fiz o seguinte codigo:
    Código:
    $ticket = rand(0, 1); 
    $select = mysql_query ("SELECT * FROM tb_lottery where ticket='$ticket'");
    $sler = mysql_fetch_array($select);
    $num = $sler['ticket'];
    if ($ticket == $num){
    while ($ticket == $num){
    $ticket = rand(0,10);
    $ticker = $ticket;
    }
    $sqli = mysql_query ("INSERT INTO XXXX (username, email, choice, ticket) VALUES ('$lole','$email','$choice', '$ticker')");
    exit();
    }
    $sql = mysql_query ("INSERT INTO XXXX(username, email, choice, ticket) VALUES ('$lole','$email','$choice', '$ticket')");
    include ('XXXX.php');
    exit();
    }
    O problema é o meu script não está a funcionar correctamente... isto é se o $ticket fosse igual ao $num ele iria correr o $ticket = rand(0,1) até que ele fosse diferente de $num, mas isso não acontece... resultado.. numeros iguais na base de dados...
    O que estou eu a fazer de errado?
    Cumps
     
  7. hostmake

    hostmake Power Member

    Não percebi, mas também secalhar é da hora :(
     
  8. DarkWolfXP

    DarkWolfXP Power Member

    Bem é o seguinte...
    $ticket = numero aleatorio
    caso o numero aleatorio ja se encontre na base de dados [if ($ticket ==$num)], iria proceder a um While para tornar akela proposição falsa procurando por outro numero aleatorio...
    Mas isso não acontece
     
  9. hostmake

    hostmake Power Member

    o teu código está bem.

    já fizeste echo aos dois valores, antes do if e do while, a ver quais sao os seus conteudos?
     
  10. DarkWolfXP

    DarkWolfXP Power Member

    Hm, consegui por o codigo a bombar :003:, agr surgiu m um problema relacionado ao Looping do While...
    Meti como maximo de numeros aleatorios 10, sendo que o sistema só insere numeros unicos, o While irá estar num ciclo infinito :sad:, e só para o tempo excede os 30s de execução
    "Fatal error: Maximum execution time of 30 seconds exceeded "
    Existe alguma maneira de eu "dizer" ao While, que se ele não consegue encontrar mais numeros unicos acabe, e mostre por exemplo uma msg a dizer "Tickets are Sold out"?
    While aceita "else"?
    Cumps
     
  11. Demio

    Demio Power Member

    Usa o break; para saíres do while se excederes X tentativas de encontrar um número único ;)
     
  12. DarkWolfXP

    DarkWolfXP Power Member

    Isso n irá parar o While no primeiro loop :S?
     
  13. Demio

    Demio Power Member

    Tens de pôr um contador, e se o contador chegar a um certo número, fazes o break.
     
  14. DarkWolfXP

    DarkWolfXP Power Member

    Estou a ver... mas isso seria uma solução caso eu pretendesse um pekeno numero de Loops...
    Imagina que eu preciso de 2000 numeros unicos... ele irá ter de fazer 2000 loops até acabar :S?
    Não existe uma solução mais fiavel?
     
  15. Demio

    Demio Power Member

    O melhor era em vez de teres um random number para o ticket, fazeres com um contador, dando sempre o número seguinte ao próximo ticket, e guardavas o número do último ticket gerado.

    Se o último fosse == 2000 então já não fazias mais.
     
  16. DarkWolfXP

    DarkWolfXP Power Member

    pois mas assim perdia o efeito lotaria :(...
    O numero tem de ser aleatorio... era bom se pudesse fazer em sequencia...
    Cumps
     
  17. MPalhas

    MPalhas Power Member

    Código:
    $ticket = rand(0, 1); 
    $select = mysql_query ("SELECT * FROM tb_lottery where ticket='$ticket'");
    $sler = mysql_fetch_array($select);
    $num = $sler['ticket'];
    if ($ticket == $num){
      while ($ticket == $num){
        $ticket = rand(0,10);
        $ticker = $ticket;
      }
      $sqli = mysql_query ("INSERT INTO XXXX (username, email, choice, ticket) VALUES ('$lole','$email','$choice', '$ticker')");
      exit();
    }
    $sql = mysql_query ("INSERT INTO XXXX(username, email, choice, ticket) VALUES ('$lole','$email','$choice', '$ticket')");
    include ('XXXX.php');
    exit();
    }
    não estou a perceber muito bem este teu código
    o $ticket é um número aleatório, e depois vais procurar um registo na BD que cumpra ticket=$ticket, até ai tudo bem, depois atribuis a $num o valor de ticket do primeiro registo encontrado na query. valor esse que vai ser igual a $ticket!!!!
    isto não é o mesmo que fazer logo $num=$ticket?? isto depois vai fazer com que a condição do if e do while seja sempre verdadeira, pelo menos na primeira passagem

    depois vais fazer um novo Rand entre 1 e 10 até que seja diferente de num (porque é que antes fizeste Rand(0,1) e no while fazes Rand(0,10)?), e atribuis á variavel $ticker (porquê??)

    também não faz sentido teres um if, e logo a seguir um while com a mesma condição e é isso memso que te está a estragar tudo. como já disse o if é sempre verdadeiro, por isso essa primeira query que está dentro do if vai ser sempre executada. ao sair do if vai logo executar a segunda query, que vai inserir os mesmos valores, logo, estás sempre a inserir dois registos iguais de cada vez

    o que eu acho é que secalhar começaste a complicar demais até que ficou uma confusão total, uma coisa que poderia ser muito simples
     
  18. hostmake

    hostmake Power Member

    Eu não percebi mais nada deste tópico quase, depois de te ter dado o código para gerar probabilidades enganosas.

    Diz la o que queres outra vez, para ver se faço ai um código sample, se tiveres interessado.
     
  19. DarkWolfXP

    DarkWolfXP Power Member

    Não seria a mesma coisa que fazer $num=$ticket...
    Isto porque eu quero saber se akele numero ja existe na base de dados ou não... se existir (if ($ticket == $num) corre o While... é por isso é que é diferente... do que fazer $num=$ticket...
    Eu fiz de rand(0,10), para ver se o while produzia numeros unicos de até 10 sem repetir... E acontece... o problema chega kd eu peço o 11º ticket, onde ja existem todos os numeros possiveis e o While não para o Loop


    EDIT:
    Vou explicar por passos, e detalhadamente:
    Código:
    //Gero um numero aleatorio
    $ticket = rand(0, 1); 
    //Vou ver se o numero aleatorio criado ja existe na base de dados
    $select = mysql_query ("SELECT * FROM XXXX where ticket='$ticket'");
    $sler = mysql_fetch_array($select);
    $num = $sler['ticket'];
    echo "$ticket e $num";
    // Caso o $ticket e o $num sejam iguais então irei selecionar outro numero diferente
    if ($ticket == $num){
    while ($ticket = $num){
    $ticket = rand(0,10);
    $select = mysql_query ("SELECT * FROM XXXX where ticket='$ticket'");
    $sler = mysql_fetch_array($select);
    $num = $sler['ticket'];
    }
    // Insiro o novo numero na base de dados diferente que $ticket
    $sqli = mysql_query ("INSERT INTO XXXX (username, email, choice, ticket) VALUES ('$lole','$email','$choice', '$ticket')");
    include ('XXXX.php');
    exit();
    }
     
    Última edição: 4 de Abril de 2008
  20. hostmake

    hostmake Power Member

    Diz só o que pretendes, teoricamente fazer sff.
     

Partilhar esta Página