Jump to content
Fórum Script Brasil
  • 0

Dúvida Avançada: Registro Aleatório


Guest --EvandroPH --

Question

Guest --EvandroPH --

Boa Noite,

Trabalho com PHP há bastante tempo e faço quase de tudo nele. Estou trabalhando em um site em PHP com um jogo estilo RPG, e preciso auxílio em uma função.

Preciso que o sistema me retorne um registro aleatório de uma tabela, mas respeitando a chance de cada valor ser atingido, por exemplo:

Minha tabela:

Código -- Nome -- Chance

1 -- São Paulo -- 100

2 -- Rio de Janeiro -- 60

3 -- Santa Catarina -- 20

4 -- Paraná -- 20

Atualmente eu faço assim:

Somo os valores do campo chance (totalchance), e gero o percentual de cada registro ((chance / totalchance)*100):

A função me retorna os valores, sendo que:

"São Paulo" teria 50% de chance de cair

"Rio de Janeiro" teria 30% de chance e assim conforme a tabela...

Para fazer isso eu criei uma função que gera uma matriz com 100 campos, repetindo o nome a cada percentual

Exemplo:

São paulo usaria os 50 primeiros campos da matriz, depois viria o Rio usando os 30 seguintes, e assim por diante.

A partir dessa matriz eu gero um número aleatório de 1 a 100 e retorno o Nome correspondente ao valor "sorteado".

Beleza, funciona legal, apesar de inconsistente...

Mas o problema é que terei que fazer isso com uma tabela com mais de 500 nomes agora, e fica complicado fazer uma matriz de tal tamanho, pois começaria a sobrecarregar o servidor, imagine 50 pessoas acessando o site ao mesmo tempo... E eu teria valores mais precisos, como:

1 -- São Paulo -- 8750

2 -- Rio de Janeiro -- 6080

3 -- Santa Catarina -- 2040

4 -- Paraná -- 2097

5 -- Maranguape -- 7

6 -- Maringa -- 22

Nesse caso, as cidades abaixo dos estados teriam uma chance bem remota de ser sorteadas, mas essa chance existe... Se eu criar uma matrix de 100 campos, essas cidades cairiam fora de vez... E somar tudo e criar uma matriz com tudo? Coitado do servidor... e imagina a internet que a pessoa teria que ter, pra retornar nesse caso mais de 15mil registros só em uma matriz...

Gostaria de saber se existe uma função ou algum modo de fazer isso direto na tabela (sem gerar a matriz), ou se tiverem alguma outra sugestão, estou 100% disposto a ouvir...

Abraço a todos!

Link to comment
Share on other sites

6 answers to this question

Recommended Posts

  • 0

O que você pode fazer é dividir tudo por um mesmo número e arredondar pra o primeiro inteiro acima... por exemplo, dividir tudo por cem... obvio que as cidades 6 e 7 ficariam com 1 ítem cada na matriz... mas acho que é o único jeito para seguir a sua linha de raciocínio... a menos que exista algum milagroso pra se fazer direto na query...

Link to comment
Share on other sites

  • 0

pois é... não precisa nem seguir minha mesma lógica de raciocínio, pode seguir qualquer outra... Eu fiz desse jeito porque achei que seria o único jeito de se fazer, mas acabou se tornando complicado demais... o que pensei em fazer, é ao gerar a matriz, fazer um esquema para que as cidades que tivessem valor abaixo de 1, as vezes aparecesse, as vezes não... mas, uma cidade com 0,9% de chance na verdade poderia ter menor chance de aparecer que uma com 0,00001%

E claro, os dados que coloquei foram só um exemplo... imagina essa tabela com cerca de 50mil cidades, claro, filtrada teria ao menos 500... imagina que no mínimo 400 dessas teria um valor menos que 1%... e aí... quebraram-se minhas pernas... =)

Aí que está mesmo meu problema...

Fazer por eliminação? Também não seria consistente o resultado... O que eu poderia fazer é tentar convencer a direção do projeto aqui a filtrar para menos de 20 cidades cada vez que precisasse fazer isso... mas acho difícil fazerem isso...

Link to comment
Share on other sites

  • 0

Já pensou em enviar tudo para uma tabela qualquer e após enviar utilizar o RAND para sortear e depois simplesmente apagar? Porque escrever por exemplo, 20 mil linhas em um BD como o MySQL se faz rapidão... é claro que a solução não é ideal, mas nesse seu caso específico acho que não existe alguma boa, só "a ruim" e "a menos pior" :lol: ...

Link to comment
Share on other sites

  • 0

É uma boa idéia... acho que já estou pedindo demais, mas tem alguma função que retorna o tempo de execução de uma rotina? Eu fazia isso no Delphi, mas no PHP nunca tentei... Só pra saber qual das maneiras fica mais rápido.

To pensando em fazer em 3 partes,

primeiro filtrar a tabela, tipo, até ficar uns 500 registros no máximo...

segundo jogar numa matriz de 300 campos as 290 cidades melhores pontuadas (com mais chance)

Segundo fazer 2 sorteios:

1 - Pegar todas as cidades com menos de 0,1% e sortear 2 delas pra ir pra matriz

2 - Pegar as cidades com 0,1% até a pior colocada das 290 cidades lá de cima e sortear 8 delas e jogar na matriz

Aí eu teria uma matriz mais ou menos bem sorteada, acredito eu...

Aí, dou um Random de 1 a 300 e boa...

Não é o mais confiável, mas penso ser o mais funcional...

Ou vou tentar fazer a tabela mesmo... vamos ver qual fica mais rápido...

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.5k
×
×
  • Create New...