login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Online game

Offline Sar - 12/05/2008 01:37
Avatar van SarPHP interesse Hey,

Ik ben bezig met een online game.
Nu kan je er trainen, en die werkt ook wel. Maar de luck rate is niet heel goed. Het gaat vaker mis dat goed.

Nou is dat ook wel logisch, want je kan 3 dingen krijgen:

- Aangevallen door vijand, geld verloren.
- Aangevallen door vijand, ontsnapt.
- Training gelukt, exp. ontvangen.

Nou heb ik zo dat ik drie nummers in een array heb (1, 2, 3) en drie teksten die bij de nummers horen, dan pak ik met array_rand() 1 van die nummers en de bijbehorende tekst.

Maar aangezien het foutgaan dus altijd 2 kansen heeft en het goed gaan maar 1, zal het foute altijd veel meer gebeuren, nou moet die zowiezo wel meer gebeuren meestal, maar het gebeurt nu veelste vaak.

Dus weet iemand mischien een andere oplossing?

Alvast bedankt!

Sar

11 antwoorden

Gesponsorde links
Offline maigel - 12/05/2008 10:47
Avatar van maigel PHP beginner je kan misschien die derde er nog een keer inzetten zodanig dat de kans op goed-slecht 50/50 is?
Offline Martijn - 12/05/2008 11:41
Avatar van Martijn Crew PHP misschien nog 1 goed situatie erbij bedenken?
Offline Sar - 12/05/2008 11:47
Avatar van Sar PHP interesse hmm, ja, dat is mischien wel een idee... Dat ik daar zelf niet op kwam  

Maar zijn er ook andere (betere) manieren?
Offline Martijn - 12/05/2008 11:50 (laatste wijziging 12/05/2008 11:50)
Avatar van Martijn Crew PHP je kunt bv rand(1,4); doen
1+2->goed
2-> ene slecht
4->andere slecht
Offline Simax - 12/05/2008 12:00
Avatar van Simax Onbekend Je hebt nu 1/3 met een goed resultaat.
Bedenk er 2 bij, zodat het 2/5 word, dan is percentage goed iets hoger, maar blijft het persentage slecht toch hoger..
Offline Grayen - 12/05/2008 12:29
Avatar van Grayen PHP ver gevorderde Ik heb even een functie geschreven die doet wat jij wilt .

  1. <?php
  2. /* Het gebruik is als volgt:
  3.  *
  4.  * chances(array
  5.  * (
  6.  * 'test' => 20,
  7.  * 'blaat' => 80
  8.  * ));
  9.  *
  10.  * Dus de key bevat de waarde en de value
  11.  * de kans dat het die waarde zal worden.
  12.  *
  13.  * De kans mag alleen hele getallen bevatten.
  14.  */
  15.  
  16. function chances($aInput)
  17. {
  18. // De kansen samen moeten 100% zijn.
  19. if (array_sum($aInput) !== 100)
  20. {
  21. return false;
  22. }
  23.  
  24. $iLowest = min($aInput);
  25.  
  26. $aNew = array();
  27.  
  28. $bDivide = true;
  29.  
  30. foreach ($aInput as $mValue => $iChance)
  31. {
  32. if (!is_int($iChance))
  33. {
  34. return false;
  35. }
  36.  
  37. if ($bDivide)
  38. {
  39. $iNew = $iChance / $iLowest;
  40.  
  41. if (is_int($iNew))
  42. {
  43. $aNew[$mValue] = $iNew;
  44. }
  45. else
  46. {
  47. $bDivide = false;
  48.  
  49. $aNew = array();
  50. }
  51. }
  52. }
  53.  
  54. if ($bDivide)
  55. {
  56. $aInput = $aNew;
  57. }
  58.  
  59. $aChance = array();
  60.  
  61. foreach ($aInput as $mValue => $iChance)
  62. {
  63. $aChance = array_merge($aChance, array_fill(0, $iChance, $mValue));
  64. }
  65.  
  66. $iKey = array_rand($aChance);
  67.  
  68. return $aChance[$iKey];
  69. }
  70.  
  71. var_dump(chances(array('test' => 20, 'yay' => 80)));
  72. ?>
Offline thomasje - 12/05/2008 12:31
Avatar van thomasje MySQL beginner waarom doe je niet iets, dat het wel goed is maar weinig gewonnen heb, dan willen ze automatisch wel meer.
Offline Simax - 12/05/2008 15:45
Avatar van Simax Onbekend Waarom doe je niet gewoon 2/5?
Dan is het percentage goed hoger dan bij 1/3 .
Offline Ultimatum - 12/05/2008 23:51
Avatar van Ultimatum PHP expert Misschien wil hij maar 3 opties? Wat nou als je eerst een rand(1,2) doet, 1 is gelukt, 2 is niet. Nu heb je dus 50% kans dat het wel gelukt is of niet. En dan ga je controleren wat het getal is, 2 is met nog een rand kijken welke tekst je dan krijgt en anders is het gelukt.

Maar de functie van Grayen ziet er ook goed uit 
Offline nemesiskoen - 13/05/2008 08:22 (laatste wijziging 13/05/2008 15:17)
Avatar van nemesiskoen Gouden medaille

PHP expert
@grayen: wat jij doet is veel te omslachtig, dat kan veel korter.

  1. function randArray($array)
  2. {
  3. if(array_sum($array) != 100)
  4. return false;
  5.  
  6. $getal = rand(0,100);
  7. $som = 0;
  8. foreach($array as $k => $v)
  9. {
  10. if(!is_numeric($v)) return false;
  11. $som+=$v;
  12. if($getal <= $som) return $k;
  13. }
  14. }


@volgende post: inderdaad, die $aInput moest nog vervangen worden:-)
Offline Grayen - 13/05/2008 12:36
Avatar van Grayen PHP ver gevorderde @vage
Ja dat is waar, maar je moet het maar net zien. Ik was er niet opgekomen om het op jouw manier te doen. Het gebruik array_fill is inderdaad niet zo'n mooi, maar was zo snel de enige manier die ik zag.

Je moet wel nog even $aInput in jouw functie vervangen voor $array. Nu zal hij altijd false returnen. $aInput bestaat immers niet.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.202s