PHP Probalidades

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
 
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
 
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;

?>
 
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 ;).
 
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.
 
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
 
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
 
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
 
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?
 
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.
 
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
 
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.
 
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:
Back
Topo