Archief - [PROG]PHP formule om goudwinst te bepalen.

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Bram

Legacy Member
Als amusement voor tijdens de examens en vakantie wou ik beginnen aan een kleine PHP game...

voornamelijk als amusement, en als PHP oefening, nu zit ik met een ei...
een deel van het spel is dat er goud gemined zal moeten worden, tussen de 150 en 350 stukken per dag.
Dat maakt dus 200 goudstukken verschil, maar ik wil dat de kans kleiner is dat je tegen de 350 verdient, dan 150... dus
PHP:
$min = 150;
$max = 350;
$diff = $max - $min;
$total = $min + rand(0, $diff);
is geen optie...
Ik had gedacht om het zo te doen: de 200 goudstukken verschil in 4 schijven verdelen, en dan voor elk vierde een percentage kans dat je het volledige vierde krijgt... (maar nog altijd een willekeurig getal, gewoon een kleinere kans dat je het volledige deel krijgt)

theeft misschien minder met php te maken, en meer met een wiskundige formule, maar ik zie het even niet, vandaar dat ik jullie hulp even inroep...

alvast bedankt.

Kemblin

Legacy Member
ken niet juist meer de php syntax maar denk zoiets in de richting van


Code:
$min = 150;
$max = 350;
$tot = $min;

if( rand(0, 1) == 1) {
	$tot += rand(0, 50);
	if( rand(0, 1) == 1) {
		$tot += rand(0, 50);
		if( rand(0, 1) == 1) {
			$tot += rand(0, 50);
			if( rand(0, 1) == 1) {
				$tot += rand(0, 50);
			}
		}
	}
}

mss de waarden wel wat aanpassen want nu hebt ge echt een heel kleine kans op 350 :p

edit kans op 350 is dus zoiets alla:
(0.5*1/51)*(0.5*1/51)*(0.5*1/51)*(0.5*1/51)

MilM

Legacy Member
Heeft idd weinig met code te maken, eerder met het ontwerp van een game.
Er zijn ontelbare functies om dit te doen, maar je moet natuurlijk een functie vinden die "realistisch" is binnen de bedoeling van het game.

Je moet dus ergens voor uzelf gaan uitmaken wat een realistische functies is.

Nu, om twee voorbeelden te geven.
Je kunt het zelf handmatig doen.

Stel bv dat de kans op [150,200[ het dubbele is dan de kans op [200,250[
en die van [200,250] het dubbele dan [250,300[
en van [250,300[ het dubbele dan [300,350[

Dan kunt ge bv eerst een getal tussen 1 en 15 genereren.
Aan de hand van dit getal, ga je dan een getal gaan genereren uit een deelinterval
getal 1- 8-> genereer getal in [150,200[
getal 9 - 12 - > genereer getal in [200,250[
getal 13 - 14 -> genereer getal in [250,300[
getal 15 -> genereer getal in [300,350[

Op de manier maak je veel meer kans op een lager getal dan een hoog

Ipv halvering, kun je ook gewoon telkens met 1 verlagen.
Bv 1-6 -> eerste interval
7 - 12 -> tweede interval
13 - 17 -> derde interval

etc ...

Er zijn dus oneindig veel oplossingen

Dit is nu wel handmatig gemaakt en me deelintervallen.
Indien ge wilt da da continu oploopt, dan moet ge met een functie werken.

Bv de kwadratische functie.

Het verschil is 200
Dus (200)² = 40000

Genereer een getal tussen [0,40000], neem er de vierkantswortel van en rond het af naar boven, zodat je geheel getal komt.

Nu, 5,6,7,8,9 wordt dus afgerond naar 3.
Dat zijn 5 mogelijkheden op 40001.

Daarentegen wordt alles uit [39602,40000] afgerond naar 200
Maw, bijna, 400 mogelijkheden op 4001

Veel meer dus.
Als je een meer stijgende functie kiest, zal het dus nog meer verschillen.

Let wel op, nu maak je meer kans op een groot getal, terwijl jij het omgekeerde wilt.

Dus doe gewoon (200 - resultaat) en dan is het juist.
Je maakt nu veel kans op 0 en weinig op 200 ipv veel kans op 200 en weinig op 0

[BAT] Hydra

Legacy Member
Probeer anders dit eens:

PHP:
$min = 150;
$max = 350;
$diff = $max - $min;
$total = round(pow(rand()/getrandmax(),2)*$diff+$min);

Een reeks getallen dat dit genereert staat ook op http://www.bat-clan.be/random_numbers.php

Als X een variabele is die getalwaarden kan aannemen dan is de kans dat je een getal genereert kleiner als Y

P(X < Y) = sqrt((Y-150)/200)

De kans op een waarde kleiner dan 250 is dan (ongeveer, niet exact want ik rond met round(..)) 70,7%

Bram

Legacy Member
Hydra, super bedankt, ziet er goed uit. ik snap alleen niet waarom je kwadrateert?

[BAT] Hydra

Legacy Member
SveltestSword zei:
Hydra, super bedankt, ziet er goed uit. ik snap alleen niet waarom je kwadrateert?

Als je niet kwadradeert is de kans dat je een getal in de buurt van 330 krijgt even groot als de kans dat je een getal in de buurt van 170 krijgt. De helft van de getallen is groter dan 250, en de andere helft van de getallen is kleiner dan 250.

Door te kwadrateren zorg je voor een transformatie op deze kansverdeling. De kans dat je getal in de buurt van 330 krijgt is veel lager dan de kans dat je een getal in de buurt van 170 krijgt. De helft van de getallen is groter dan 200, en de andere helft van de getallen is kleiner dan 200. Hoe dichter je met een getal bij 350 komt, hoe kleiner de kans is om effectief dat getal te bekomen.

[BAT] Hydra

Legacy Member
MilM zei:
Heel den uitleg voor niets blijkbaar ... :p

Hij zal het waarschijnlijk niet begrepen hebben of niet gelezen hebben. Maar het eerste komt zeker niet doordat jouw uitleg onverstaanbaar is.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan