login  Naam:   Wachtwoord: 
Registreer je!
 Forum

random gebeurtenis

Offline Stefan14 - 11/12/2009 00:48
Avatar van Stefan14PHP gevorderde Ik wil een random gebeurtenis laten plaatsvinden. Maar zit met een situatie waarvoor ik niet precies weet hoe ik dit moet scripten.

Bedoeling is om de gebeurtenis 'zo nu en dan' te laten plaatsvinden zonder dat hier echt een regelmaat in te ontdekken is en zonder dat deze te vaak voorkomt.
Bijv. elke 1000 kliks en dan met een speling van 100/150 kliks naar beneden of boven.

Ook andere ideeën zijn welkom.

16 antwoorden

Gesponsorde links
Offline voltrex - 11/12/2009 07:41
Avatar van voltrex Lid Je kan ook gewoon de rand() functie gebruiken van php. (als je deze methode goedvind:)
  1. $rand = rand(1,1000);
  2. if($rand == 5){
  3. // Codes
  4. }


Heb nu maar even 1000 en 5 gepakt.
Of vind je dit geen mogelijkheid?
Offline Stefan14 - 11/12/2009 13:40
Avatar van Stefan14 PHP gevorderde Jij hebt nu dus een code gemaakt die uitgevoerd wordt zodra $rand 5 is?

Dat is dus een kans van 0,1%, maar er is een kans dat deze bijv. na 50 kliks weer uitgevoerd wordt, dat vind ik te snel en mag ook eigenlijk niet voorkomen.

Ik moet echt iets hebben wat maar zo nu en dan voorkomt, daarom ook mijn voorbeeld dat het iedere keer zo rond de 1000 kliks moest voorkomen met een wat speling naar onder en naar boven om het onvoorspelbaar te houden.
Offline voltrex - 11/12/2009 13:48 (laatste wijziging 11/12/2009 13:48)
Avatar van voltrex Lid Een mogelijkheid is om een tabel in je database te maken met 'clicks'.
Elke keer de pagina bezocht wordt zet je dan clicks + 1. En vanaf je dan bv. 800 clicks hebt maak je een rand zoals in voorbeeld hierboven (maar dan misschien met wat meer kans). Als deze rand dan uitkomt op (wat ik hierboven 5 heb gekozen), doe je dan je gebeurtenis en reset je 'clicks' naar 0.
Maar misschien vind je dit een beetje vergezocht.  
Offline Stefan14 - 11/12/2009 13:50 (laatste wijziging 11/12/2009 13:50)
Avatar van Stefan14 PHP gevorderde Ik ben zelf even aan het stoeien geweest, en ben op het volgende uitgekomen:

  1. <?php
  2. $query = "SELECT kliks FROM users WHERE userID = ".$_SESSION['userID'];
  3. $result = mysql_query($query) or die (mysql_error());
  4. $kliks = mysql_result($result,0,'kliks');
  5.  
  6. $bottom = 1000 - mt_rand(0,150);
  7. $top = 1000 + mt_rand(0,150);
  8.  
  9. $rand = mt_rand($bottom,$top);
  10.  
  11. if ($kliks == $rand)
  12. {
  13. // code uitvoeren en aantal in database weer op 0 zetten
  14. }
  15. elseif ($kliks >= 1200)
  16. {
  17. // code zowieso uitvoeren en aantal in database weer op 0 zetten
  18. }
  19. ?>


maar weet niet of dit genoeg kans biedt, of dat hij dan eigenlijk altijd die 1200 zal pakken?
Offline Martijn - 11/12/2009 14:35 (laatste wijziging 11/12/2009 14:36)
Avatar van Martijn Crew PHP
  1. $rand = rand(1,1000);
  2. $nodig = 5;
  3. echo "kans is 1 op ".$rand/$nodig;
  4. if($rand == $nodig){
  5. // Codes
  6. }


Doe dat is, en daarna moet je van 1000 eens 2000 maken beetje spelen.

edit: Op deze manier is er speling, omdat het random is kan je bv 2x achter elkaar nr $nodig krijgen, of slecht eens per 2xde max van rand.
Offline Filip - 11/12/2009 19:28 (laatste wijziging 11/12/2009 19:32)
Avatar van Filip IRC guru Blijkbaar missen er een aantal mensen het idee dat het aantal clicks elke keer omhoog gaat, dus delen door 5 om de kans te berekenen is niet echt correct, aangezien er maar 1 nummer correct kan zijn.. dus is de kans 1 op 1000, en als je 2000 neemt is de kans 1 op 2000..

Hij wil een random getal rond de 1000, dat de code uitvoert als het aantal clicks op die moment gelijk is aan de rand..

Effe op zijn script reageren dan:

Je script bied op deze moment een kans van 1 op 2 tot 300, hangt van je randoms af (top en bottom)

Voor het script dat jij wil denk ik dat een kans van 1 op 100 al ruim voldoende is, dan hebben ze 400 pogingen tot aan de 1200, waardoor de kans groot is dat die ervoor wel een keer geraakt word.

Dus, ik zou die random van top en bottom aanpassen, en er gewoon van maken:

  1. $aantal_clicks = 850; // normaal is dit dus een database entry
  2.  
  3. $top = $aantal_clicks + 50;
  4. $bottom = $aantal_clicks - 50;
  5.  
  6. // nu zit he op 50 onder en 50 boven het huidige aantal kliks
  7.  
  8. $rand = rand($bottom,$top); // dit word dus een random getal tussen de 800 en 900
  9.  
  10. // en alhier de rest van je ifjes enzo
Offline henver - 11/12/2009 19:44 (laatste wijziging 12/12/2009 13:38)
Avatar van henver HTML gevorderde Is het ook niet de bedoeling dat de kans groter wordt naarmate er meer kliks zijn? Ik zou opteren voor volgende mogelijkheid:

  1. $aantal_clicks = 1000; // Variabele uit de database
  2. $minimum_clicks = 850; // Ondergrens (1000-150)
  3. $maximum_clicks = 1150; // Bovengrens (1000+150)
  4.  
  5. $rand = mt_rand($aantal_clicks, $maximum_clicks);
  6.  
  7. if($aantal_clicks >= $minimum_clicks && $aantal_clicks == $rand){
  8. // Random gebeurtenis, in dit geval een kans van 1/150
  9. // Aantal clicks resetten
  10. }


Dit zorgt ervoor dat er bij:
- 1 click een kans is van 0
- 2 clicks een kans is van 0
- ...
- 849 clicks een kans is van 0
- 850 clicks een kans is van 1/300
- 851 clicks een kans is van 1/299
- ...
- 1000 clicks een kans is van 1/150
- 1001 clicks een kans is van 1/149
- ...
- 1149 clicks een kans is van 1/2
- 1150 clicks een kans is van 1/1 (dus sowieso een random gebeurtenis)

NB: ik zou de grenzen wel wat hoger leggen, want je zit aan 1000 clicks voor je het weet
Offline Filip - 12/12/2009 10:58
Avatar van Filip IRC guru En alweer heb je daar een foutje in de redenering...

Het is niet omdat je maximum getal 1150 is, dat je op 1150 ook zoizo een hit hebt op je random, dus die kansberekening klopt niet..

Je hebt over heel dat script een kans van 1 op 300 aangezien er 300 getallen zijn, en 1 dat het juiste is..

en dat vanaf 1 klik tot 849 je kans 0 is, is logisch, aangezien die helemaal niet kunnen gekozen worden door de rand..
Offline henver - 12/12/2009 13:23 (laatste wijziging 12/12/2009 13:28)
Avatar van henver HTML gevorderde Ik denk toch wel dat mijn redenering klopt:

Als het aantal kliks 1150 is, is het random getal toch ook 1150:
  1. $rand = mt_rand(1150,1150);
Als het aantal kliks 1100 is, is er wel degelijk een kans van 1/50: (om correct te zijn: 1/51)
  1. $rand = mt_rand(1100,1150);


Ik denk dat je in de mt_rand() functie $aantal_clicks hebt zien staan als $minimum_clicks.

En 849 kan wel gekozen worden door de mt_rand() functie: weer zie je $aantal_clicks als $minimum_clicks 
Offline Martijn - 12/12/2009 13:28
Avatar van Martijn Crew PHP stel je hebt rand(1,1000);
Dan heb je elke klik 1/1000ste kans dat het gebeurd. na 15 kliks heb je dus THEORETISCH 15/duizendste kans dat het de 16 keer gebeurd.

dat houd niet in dat je de duizendste klik pas iets hebt. Dan heb je een zeer grote kans dat ie is geweest of zo gaat komen.

Het is RANDOM, het kan dus ook zijn dat je pas na 3000 kliks 3x achter elkaar iets krijgt
Offline henver - 12/12/2009 13:35
Avatar van henver HTML gevorderde Martijn: klopt, maar hij wil dat de gebeurtenis NIET plaatsvindt als er (bijvoorbeeld):
- minder dan 850 kliks zijn
- meer dan 1150 kliks zijn

Dus moet er iets gemaakt worden dat bij 1150 kliks SOWIESO een random gebeurtenis plaatsvindt (als deze al niet heeft plaatsgevonden).
En dat is toch exact wat mijn code doet?
Offline Rik - 12/12/2009 15:22
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Henver, met jouw code wordt de kans niet groter naarmate je dichter bij de bovengrens komt. Zo wel:
  1. /* grenzen */
  2. $ondergrens = 850;
  3. $rond = 1000;
  4. $bovengrens = 1200;
  5.  
  6. $aantal = 1223; // aantal cliks dat de gebruiker al heeft (uit de db halen)
  7.  
  8. /* aantal moeten binnen grenzen liggen */
  9. if ($aantal >= $ondergrens && $aantal <= $bovengrens) {
  10. /* 0 kans voor ondergrens, 1 kans voor bovengrens */
  11. $kans = 1 - (($bovengrens - $aantal) / ($bovengrens - $ondergrens));
  12. /* vergelijk met getal tussen 0 en 1 */
  13. if ($kans > mt_rand(0, 10000) / 10000) {
  14. /* gebeurtenis */
  15. echo '!!!! geluk !!!!';
  16. $aantal = 0; // teller resetten
  17. }
  18. }
Offline henver - 12/12/2009 17:47
Avatar van henver HTML gevorderde Rik, waarom wordt de kans dan niet groter?
Het kan kloppen wat je zegt, maar ik zou niet weten waarom.
Offline UpLink - 12/12/2009 17:59 (laatste wijziging 12/12/2009 18:00)
Avatar van UpLink ... Ik snap van heel die redenering niet veel...

Ik weet niet waarvoor dit script gaat/moet dienen... maar als het dient voor een spel bijvoorbeeld, zou je er dan geen wachttijd inbouwen per gebruiker na elke klik van X-aantal minuten...

Anders wil ik gerust komen spelen en mijn F5 toets ingedrukt houden aangezien elke refresh toch als een nieuwe klik word aanzien... dan ben ik zeker dat ik die random binnen elke minuut passeer...
Dan heb je dat "onvoorspelbare" toch ook niets...

Of zit ik er met mijn redenatie ook naast?
Offline Rik - 13/12/2009 12:14 (laatste wijziging 14/12/2009 14:10)
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
henver schreef:
Rik, waarom wordt de kans dan niet groter?
Het kan kloppen wat je zegt, maar ik zou niet weten waarom.
Ik had ongelijk, jouw code doet wel exact het zelfde als dat van mij...  

Maar wat ik nu bedenk, je hebt nu op de ondergrens 0 kans op de gebeurtenis en 1 op de bovengrens. Zou het niet beter zijn om dat wat evenwichtiger te maken? Je zou met de normale verdeling en wat berekeningen aan de standaard afwijking een heel eind moeten kunnen komen.

Met een beetje aanpassing kom ik zo wel redelijk uit:[code=php]/* Verwijderd */80 % kans (0.8) bij 1000 cliks, en dat loopt langzaam af tot de randen. Je zou nog wel een controle moeten inbouwen voor de bovengrens. Want als iemand zó veel pech heeft dat ie dan nog geen gebeurtenis heeft gehad moet er iets gebeuren...

Edit:
Ik denk even hardop: hmm, wat nog wel zo is... De som van de kansen van de ondergens tot de 1000 is natuurlijk enorm op deze manier. Netto zal die gebeurtenis dus vaak onder de 1000 cliks vallen. Is het handig om van te voren uit te rekenen wanneer een bepaalde persoon z'n gebeurtenis krijgt?

Edit 2:
Ik zie nu dat ik weer dezelfde code heb gepost. Helaas heb ik m'n test code al weggegooid....
Offline Martijn - 13/12/2009 13:29 (laatste wijziging 13/12/2009 13:30)
Avatar van Martijn Crew PHP
  1. $min = 850;
  2. $max = 1150;
  3.  
  4. $_SESSION['kliks'] = isset($_SESSION['kliks']) ? $_SESSION['kliks'] : 0;
  5. $_SESSION['nodig'] = isset($_SESSION['nodig']) ? $_SESSION['nodig'] : rand($min,$max);
  6. $_SESSION['kliks']++;
  7.  
  8. if($_SESSION['kliks']>=$_SESSION['nodig']){
  9. //Voer uit
  10. $_SESSION['kliks'] = 0;
  11. $_SESSION['nodig'] = rand($min,$max);
  12. }


tataa. Niet zo lastig denken
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.268s