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.
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.
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.
<?php
$query = "SELECT kliks FROM users WHERE userID = ".$_SESSION['userID'];
$result = mysql_query($query) or die (mysql_error());
$kliks = mysql_result($result,0,'kliks');
$bottom = 1000 - mt_rand(0,150);
$top = 1000 + mt_rand(0,150);
$rand = mt_rand($bottom,$top);
if ($kliks == $rand)
{
// code uitvoeren en aantal in database weer op 0 zetten
}
elseif ($kliks >= 1200)
{
// code zowieso uitvoeren en aantal in database weer op 0 zetten
}
?>
<?php
$query="SELECT kliks FROM users WHERE userID = ".$_SESSION['userID'];
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.
Filip - 11/12/2009 19:28 (laatste wijziging 11/12/2009 19:32)
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:
$aantal_clicks = 850; // normaal is dit dus een database entry
$top = $aantal_clicks + 50;
$bottom = $aantal_clicks - 50;
// nu zit he op 50 onder en 50 boven het huidige aantal kliks
$rand = rand($bottom,$top); // dit word dus een random getal tussen de 800 en 900
// en alhier de rest van je ifjes enzo
$aantal_clicks=850;// normaal is dit dus een database entry
$top=$aantal_clicks+50;
$bottom=$aantal_clicks-50;
// nu zit he op 50 onder en 50 boven het huidige aantal kliks
$rand=rand($bottom,$top);// dit word dus een random getal tussen de 800 en 900
// Random gebeurtenis, in dit geval een kans van 1/150
// Aantal clicks resetten
}
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
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
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?
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...
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....