login  Naam:   Wachtwoord: 
Registreer je!
 Forum

random met wegingsfactor

Offline Stefan14 - 13/05/2008 03:32 (laatste wijziging 13/05/2008 04:39)
Avatar van Stefan14PHP gevorderde Ik heb een situatie met een denkprobleem waar ik niet uitkom.

Ik moet bepalen of iets wel of niet wordt uitgevoerd.

Dit moet aan de hand van een percentage (0 tot 100) wat in de database staat.

Je raadt het misschien al, ik wil random bepalen of iets wel of niet uitgevoerd wordt ( mt_rand(0,1); ), maar op de een of andere manier moet ervoor gezorgd worden dat als je dicht bij de 0 zit, het vaker uitgevoerd wordt, en hoe dichter je bij de 100 komt steeds minder.

op 0 moet het altijd uitgevoerd worden en op 100 nooit, maar dat is niet zo moeilijk te realiseren.

Ik zou graag weten hoe ik ervoor kan zorgen dat bijv. 10% relatief vaker uitgevoerd wordt dan bijv. 65%.




EDIT:
Na veel zoeken met google heb ik een topic op tweakers gevonden met een soortgelijk probleem, aan de hand daarvan ben ik aan het proberen gegaan, en ben tot het volgende gekomen:

  1. <?php
  2. $aanvullen = 100 - $percentage
  3. $kansarray = array();
  4. for ($i=1; $i<=$percentage; $i++)
  5. {
  6. $kansarray[] = 0;
  7. }
  8. for ($i=1; $i<=$aanvullen; $i++)
  9. {
  10. $kansarray[] = 1;
  11. }
  12.  
  13. shuffle($kans);
  14.  
  15. $random = mt_rand(0,99);
  16.  
  17. $uitkomst = $kansarray[$random];
  18. ?>


Ik vul nu de array met 100 waardes waarvan er 'het aantal procent' 0 zijn, en de rest 1.

In mijn ogen zorgt dit voor een 'eerlijke' verdeling en levert het op wat ik wil? Heb ik het juist?

3 antwoorden

Gesponsorde links
Offline Rik - 13/05/2008 09:43
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Volgens mij kan dit veel gemakkelijker op zo'n manier:
  1. if (mt_rand(1, 100) <= 25) {
  2. // Uitvoeren
  3. } else {
  4. // Niet uitvoeren
  5. }


Dat dit eerlijk is kun je eenvoudig testen:
  1. $true = 0;
  2. $false = 0;
  3. for ($i = 0; $i < 100000; ++$i) {
  4. if (mt_rand(1, 100) <= 25) {
  5. ++$true;
  6. } else {
  7. ++$false;
  8. }
  9. }
  10. printf('Uitvoeren: %.1f%%<br />Niet uitvoeren: %.1f%%<br />', $true / 1000, $false / 1000);
Offline Stefan14 - 13/05/2008 10:18 (laatste wijziging 13/05/2008 10:19)
Avatar van Stefan14 PHP gevorderde Boukefalos: Ik weet niet wat die <= 25 betekent, en kan dat ook niet op php.net terugvinden, maar handig is het wel!

Op enkele tienden na ligt de uitvoerkans inderdaad steeds rond het percentage wat je opgeeft.
Offline Rik - 13/05/2008 10:22
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Vergeten erbij te zeggen, die 25 is het percentage van de gevallen waarin wel moet worden uitgevoerd. In jouw geval dus 65.  
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.205s