login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Kans

Offline finduilas - 10/09/2006 10:26
Avatar van finduilasPHP gevorderde Hallo,

Ik heb een probleem.Ik wil een soort kansberekening.Hoe hoger a word hoe meer kans er is dat de uitkomst een 1 is.
Dus A is een waarde die ik krijg.Door hier iets mee te doen ofzo wil ik een 1 of 0 uitkomen.Naar mate dat A stijgt moet de kans stijgen dat ik een 1 uitkom.

12 antwoorden

Gesponsorde links
Offline Rik - 10/09/2006 10:28
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
if (rand(0, 10 - $a) == 1) {
echo 'De uitkomst is een!';
}

zoiets?
Offline MechaVore - 10/09/2006 10:44 (laatste wijziging 10/09/2006 10:45)
Avatar van MechaVore Gouden medaille

PHP gevorderde
Op die manier heeft a maximaal 50% kans.., het dan namelijk 1 of 0.

  1. <?
  2. $a = 50; // 0 - 100 %.. Dus de kans.
  3.  
  4. if(rand(1,100) <= $a)
  5. {
  6. echo 'De uitkomst is een!';
  7. }
Offline Simon - 10/09/2006 10:54
Avatar van Simon PHP expert mechavore, bij jou is dat ook maximaal 50% hé...
zet tussen je haakjes onder die echo

$a + 10;
Offline Rik - 10/09/2006 11:05
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
De code van mechavore werkt goed hoor Simon, $a is bij mechavore toch het aantal keer per 100 dat het true moet zijn?

Met dit scrippie kun je dat testen:
  1. <?php
  2. $a = 86;
  3. $j = 0;
  4. for ($i = 0; $i < 100000; $i++) {
  5. $random = rand(1, 100);
  6. if ($random <= $a) {
  7. $j++;
  8. }
  9. }
  10. echo $j / 1000 . ' % van de keren was het true!';
  11. ?>


Als het goed is krijg je bij $a = 86 ook ongeveer 86 %.
Offline Simon - 10/09/2006 11:10
Avatar van Simon PHP expert ja, omdat je die a op 86 zet, zal dat natuurlijk 86 % geven  
maar hij wil ervoor zorgen dat je eerst weining kans hebt, mislukt dat, krijg je een grotere kans, bij jou is dat nie het geval
Offline Rik - 10/09/2006 11:35
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Als je naar m'n script zou kijken zou je zien dat hij 100.000 keer een random getal maakt, elke keer als dat getal minder dan a is telt hij er een bij op. Hij echoet dus niet gewoon a.

Dat random getal is elke keer iets tussen 1 en 100, als je a groter maakt dan is de kans groter dat het random getal ook echt onder a ligt. Dat was toch ook precies de bedoeling?
Offline finduilas - 10/09/2006 13:45 (laatste wijziging 11/09/2006 19:02)
Avatar van finduilas PHP gevorderde Nu zou het ook mogelijk moeten zijn om een 3de mogelijk heid te hebben.Dus een 1,0 of een 2.Zoiets probeerde ik al maar het was nogal omslachtig.

Een vb:
Als A 1 is heb je meer kans dat je 0 uitkomt.
Maar als A 6 is heb je meer kans dat je een 1 uitkomt.
Maar als A nog groter is moet de kans stijgen dat je 1 uitkomt maar ook dat je 2 uitkomt.Dus enkel de kans dat je 0 uitkomt moet dalen.

Ik dacht dus eerst een rand waar je 1 of 0 uitkomt (zoals hierboven en daarna nog een rand waar je terug een 1 of 0 uitkomt.Maar dan zit ik vast want ik heb dan 2x een mogelijkheid op 1 en 0 dus er zou een onderscheid moeten komen tussen die 2 1's & 0's.

Iemand een idee?

En EDIT: A moet ook groter kunnen zijn dan 100.Dus als het max. een getal is tussen 1 - 100 kan het bv niet groter zijn dan 110
Offline MechaVore - 11/09/2006 20:04 (laatste wijziging 11/09/2006 20:07)
Avatar van MechaVore Gouden medaille

PHP gevorderde
Ik heb even een scriptje gemaakt, waarbij de 0 in het begin een voorsprong heeft, maar de 1 en de 2 zichzelf sneller 'vergroten' en daardoor later een grotere kans maken.

Je moet het nog wel even zelf instellen, want bij de 40 heeft 2 alweer bijna 100% kans.. dus de begingetallen en de 'vergrotings' snelheden moet je nog even zelf instellen..
  1. <?
  2. function KansBerekenen($iKans /*, $bDetails = 0*/)
  3. {
  4. /*
  5. // Dit is er alleen voor om een overzicht te krijgen van de kansen, kan dus uit..
  6. // Ik zou het namelijk aanpassen zodat de kansen kloppen met wat jij in je gedachten hebt.
  7. if($bDetails == 1)
  8. {
  9. $iDetailRate0 = 200;
  10. $iDetailRate1 = 50;
  11. $iDetailRate2 = 1;
  12. for($iDetailKans = 0; $iDetailKans <= 50; $iDetailKans++)
  13. {
  14. for($i = 0; $i <= $iDetailKans; $i++)
  15. {
  16. $iDetailRate0 *= 1.01;
  17. $iDetailRate1 *= 1.08;
  18. $iDetailRate2 *= 1.09;
  19.  
  20.  
  21. }
  22. $iDetailMaxRates = $iDetailRate0 + $iDetailRate1 + $iDetailRate2;
  23. echo $iDetailKans.' [ 0 ]: '.round($iDetailRate0 / $iDetailMaxRates * 100).'%<br>';
  24. echo $iDetailKans.' [ 1 ]: '.round($iDetailRate1 / $iDetailMaxRates * 100).'%<br>';
  25. echo $iDetailKans.' [ 2 ]: '.round($iDetailRate2 / $iDetailMaxRates * 100).'%<br><br>';
  26. }
  27. }
  28. */
  29.  
  30. // Waardes voor de kans in het begin. 0 met grote voorsprong.
  31. $iRate0 = 200;
  32. $iRate1 = 50;
  33. $iRate2 = 1;
  34.  
  35. // Kans op 1 en 2 vergroten waneer $iKans groter wordt.
  36. for($i = 0; $i <= $iKans; $i++)
  37. {
  38. $iRate0 *= 1.01;
  39. $iRate1 *= 1.08;
  40. $iRate2 *= 1.09;
  41. }
  42.  
  43. // Procenten berkenen.
  44. $iMaxRates = $iRate0 + $iRate1 + $iRate2;
  45. $iProcent0 = round($iRate0 / $iMaxRates * 100);
  46. $iProcent1 = round($iRate1 / $iMaxRates * 100);
  47. $iProcent2 = round($iRate2 / $iMaxRates * 100);
  48.  
  49. // Een willekeurig getalletje pakken en kijken waar het bij hoort.
  50. $iRandomGetal = rand(1,100);
  51. if($iRandomGetal <= $iProcent0)
  52. {
  53. return 0;
  54. }
  55. elseif($iRandomGetal > ($iProcent0 + $iProcent1))
  56. {
  57. return 2;
  58. }
  59. else
  60. {
  61. return 1;
  62. }
  63. }
  64. echo KansBerekenen(6 /*, 1*/);
  65. ?>
Offline finduilas - 11/09/2006 21:16 (laatste wijziging 12/09/2006 20:56)
Avatar van finduilas PHP gevorderde Thanks;
Ik zal morgen eens wat testen.


EDIT:
  1. <?php
  2. if($rang == 'empty-suit')
  3. {
  4. $rangkans = 50;
  5. $totaalkans = $rangkans + $arr['rangvordering'];
  6. }
  7. $kans = KansBerekenen($totaalkans /*, 1*/);
  8. function KansBerekenen($iKans /*, $bDetails = 0*/)
  9. {
  10. // Waardes voor de kans in het begin. 0 met grote voorsprong.
  11. $iRate0 = 200;
  12. $iRate1 = 50;
  13. $iRate2 = 1;
  14.  
  15. // Kans op 1 en 2 vergroten waneer $iKans groter wordt.
  16. for($i = 0; $i <= $iKans; $i++)
  17. {
  18. $iRate0 *= 1.00;
  19. $iRate1 *= 1.25;
  20. $iRate2 *= 1.50;
  21. }
  22.  
  23. // Procenten berkenen.
  24. $iMaxRates = $iRate0 + $iRate1 + $iRate2;
  25. $iProcent0 = round($iRate0 / $iMaxRates * 100);
  26. $iProcent1 = round($iRate1 / $iMaxRates * 100);
  27. $iProcent2 = round($iRate2 / $iMaxRates * 100);
  28.  
  29. // Een willekeurig getalletje pakken en kijken waar het bij hoort.
  30. $iRandomGetal = rand(1,100);
  31. if($iRandomGetal <= $iProcent0)
  32. {
  33. return 0;
  34. }
  35. elseif($iRandomGetal > ($iProcent0 + $iProcent1))
  36. {
  37. return 2;
  38. }
  39. else
  40. {
  41. return 1;
  42. }
  43. }
  44. ?>


Als je deze code analyseert en je weet dat rangvordering 60 is.
dan is totaalkans 110.Hieronder de resultaten:
200+(1 *110) =310 (waarde 0)
50+(1,25 *110) =187,5(waarde 1)
1+(1,5 *110) =166(waarde 2)

Dus de kans op 0 is toch groter?Maar ik kom toch steeds 2 uit :/.Iemand die mss de oplossing ziet?



Offline MechaVore - 12/09/2006 21:18
Avatar van MechaVore Gouden medaille

PHP gevorderde
nee, de kans op 0 wordt kleiner..

200+(1*110) klopt niet.
Je moet bij elk getal tot de 110 de 200 vermenigvuldingen met bijv. 1.05, 1 kan wel, maar dan zal het altijd hetzelfde getal blijven, en gaan 1 en 2 nog sneller omhoog..

Ik heb het 'tabelletje' tussen comments gezet. zodat je zelf nog kon kijken. Maar neem nu deze hieronder (waar de comments dus weg zijn), en verander de getallen zo, dat ze ongeveer kloppen met wat jij in je gedachten hebt.
  1. <?
  2. function KansBerekenen($iKans, $bDetails = 0)
  3. {
  4. // Dit is er alleen voor om een overzicht te krijgen van de kansen, kan dus uit..
  5. // Ik zou het namelijk aanpassen zodat de kansen kloppen met wat jij in je gedachten hebt.
  6. if($bDetails == 1)
  7. {
  8. $iDetailRate0 = 200;
  9. $iDetailRate1 = 50;
  10. $iDetailRate2 = 1;
  11. for($iDetailKans = 0; $iDetailKans <= 50; $iDetailKans++)
  12. {
  13. for($i = 0; $i <= $iDetailKans; $i++)
  14. {
  15. $iDetailRate0 *= 1.01;
  16. $iDetailRate1 *= 1.08;
  17. $iDetailRate2 *= 1.09;
  18.  
  19.  
  20. }
  21. $iDetailMaxRates = $iDetailRate0 + $iDetailRate1 + $iDetailRate2;
  22. echo $iDetailKans.' [ 0 ]: '.round($iDetailRate0 / $iDetailMaxRates * 100).'%<br>';
  23. echo $iDetailKans.' [ 1 ]: '.round($iDetailRate1 / $iDetailMaxRates * 100).'%<br>';
  24. echo $iDetailKans.' [ 2 ]: '.round($iDetailRate2 / $iDetailMaxRates * 100).'%<br><br>';
  25. }
  26. }
  27.  
  28. // Waardes voor de kans in het begin. 0 met grote voorsprong.
  29. $iRate0 = 200;
  30. $iRate1 = 50;
  31. $iRate2 = 1;
  32.  
  33. // Kans op 1 en 2 vergroten waneer $iKans groter wordt.
  34. for($i = 0; $i <= $iKans; $i++)
  35. {
  36. $iRate0 *= 1.01;
  37. $iRate1 *= 1.08;
  38. $iRate2 *= 1.09;
  39. }
  40.  
  41. // Procenten berkenen.
  42. $iMaxRates = $iRate0 + $iRate1 + $iRate2;
  43. $iProcent0 = round($iRate0 / $iMaxRates * 100);
  44. $iProcent1 = round($iRate1 / $iMaxRates * 100);
  45. $iProcent2 = round($iRate2 / $iMaxRates * 100);
  46.  
  47. // Een willekeurig getalletje pakken en kijken waar het bij hoort.
  48. $iRandomGetal = rand(1,100);
  49. if($iRandomGetal <= $iProcent0)
  50. {
  51. return 0;
  52. }
  53. elseif($iRandomGetal > ($iProcent0 + $iProcent1))
  54. {
  55. return 2;
  56. }
  57. else
  58. {
  59. return 1;
  60. }
  61. }
  62. echo KansBerekenen(6, 1);
  63. ?>
Offline finduilas - 12/09/2006 21:37 (laatste wijziging 12/09/2006 21:37)
Avatar van finduilas PHP gevorderde http://provenzano.be/provenzano/kansen.php

Ik zou wel minder uitlopende kansen nodig hebben.Dus bijvoorbeeld elk 33% maar dan ook 0,50,50,...

EDIT: Alvast bedankt;Ik kan er veel mee doen .

Offline MechaVore - 12/09/2006 21:41 (laatste wijziging 12/09/2006 21:44)
Avatar van MechaVore Gouden medaille

PHP gevorderde
Het is misschien even lastig om te begrijpen. daarom zal ik het nog een keer proberen uit te leggen.

Je wilt de kans berekenen op 0, 1 en 2. maar hoe hoger het getal wordt hoe meer kans je hebt op 2, en minder kans op 1 en 0.

Daarom ga je 0, 1 en 2 telkens vergoten. De 2 begint met een klein getal, maar heeft een grotere 'groeicapaciteit'. de 0 begint met een groot getal, maar groei niet zo snel. Je laat ze groeien totdat ze het getal van de kans bereiken. Dus in bijv een while of for loop ga je alle getallen na totdat je bij de kans uitkomt. als je bijvoorbeeld het getal 40 hebt. heeft de 2 zichzelf 40 keer laten groeien, de 0 ook. alleen groeit de 0 minder snel en is de 2 misschien al 2x zo groot, en heeft de 2 ook 2x zoveel kans als de 0.

Om het precies naar wens te krijgen moet je dus het getal aanpassen waarmee de getallen groeien, en het begingetal.

Ik wou dit eigenlijk onder mijn vorige bericht typen, maar tijdens het typen viel me internet ineens uit ..

Edit
Misschien is het beter om inplaats van er telkens dus zoveel (1,5,10,20 whatever) procent bij te doen, gewoon een getal erbij optellen. dus bij de 0 1 optellen, bij 1 2 optellen en bij 2 3 optellen. Dit is misschien wat eenvoudiger om dan op een groter getal uit te komen als je snapt wat ik bedoel..
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.231s