Avatar billede pokejohn Nybegynder
08. januar 2008 - 19:00 Der er 1 løsning

Random placering ud fra en bestemt fordeling

Hej

Jeg er løbet en i et lille problem. Jeg starter lige med siden:

http://www.lordpoke.dk/skole/kingo3.php

Forklaring til siden:
Til venstre er der otte "knapper"; fra r1 til r4 og g1 og g4. Hver knap aktiverer et af de 15 grå felter til højre, som så bliver enten rødt eller gult. Én knap aktivere altså ét felt. Mit problem er at jeg gerne vil have, at alle 15 felter er aktiverede hele tiden - bestemt ud fra den procentmæssige fordeling af aktiverede knapper. Eks: Hvis en rød knap er aktiveret er alle 15 felter røde. Er tre røde og to gule aktiverede er 9 felter røde og 6 gule.
Til højre ses en tabel, hvor den procentmæssige fordeling er regnet ud og, hvor der står, hvor mange felter der "burde" være røde og gule (og en enkelt grå, når det ikke går op).
Udover det skal de farvede felter placeres tilfædigt, så én knap ikke aktivere nogen bestemte felter.

Lidt koder (der er en del gentagelser, så det er bare lidt uddrag):

En knap (her r1):
onclick="document.location.href='kingo3.php?<? if ($_r1 == "off"){ print "mode_r1=on"; } ?>&<? if ($_r2 == "on"){ print "mode_r2=on"; } ?>&<? if ($_r3 == "on"){ print "mode_r3=on"; } ?>&<? if ($_r4 == "on"){ print "mode_r4=on"; } ?>&<? if ($_g1 == "on"){ print "mode_g1=on"; } ?>&<? if ($_g2 == "on"){ print "mode_g2=on"; } ?>&<? if ($_g3 == "on"){ print "mode_g3=on"; } ?>&<? if ($_g4 == "on"){ print "mode_g4=on"; } ?>';"

Lidt omskrivninger (igen ved r1):
  if (!isset($_GET['mode_r1'])){
  $_r1 = 'off';
  } elseif ($_GET['mode_r1'] == 'on'){
  $_r1 = 'on';
  } else {
  $_r1 = 'off';
  }

Lidt udregninger (for r1 til r4):
  $r = 0;
  if ($_r1 == "on") {
  $r = $r + 1;
  }
  if ($_r2 == "on") {
  $r = $r + 1;
  }
  if ($_r3 == "on") {
  $r = $r + 1;
  }
  if ($_r4 == "on") {
  $r = $r + 1;
  }

Og lidt flere (det der bliver printet i tabellen til højre):
  $ialt = $r+$g;
  $rp = round($r/$ialt*100 , 2);
  $gp = round($g/$ialt*100 , 2);
  $rf = floor($rp*15/100);
  $gf = floor($gp*15/100);
  $graa = 15-$rf-$gf;

Jeg håber, at det er rimelig til at forstå ellers må I lige skrive, så skal jeg prøve at forklare lidt mere. I må unskylde, hvis det ikke er så forståeligt, jeg havde skrevet det hele en gang, men da jeg oprettede spørgesmålet forsvandt det hele bare. :( Så jeg skulle skrive det hele forfra, og jeg syntes ikke det er helt så godt denne gang som sidst (Sådan noget sker bare altid).

Håber at nogen kan/vil hjælpe.
-Dennis

Ps. Jeg ved godt, at noget af det kunne havde været skrevet nemmere/kortere, men første prioritet er at få det til at virke, så kan jeg skrive det om senere hvis jeg før tid (og lyst).
Avatar billede pokejohn Nybegynder
10. januar 2008 - 01:51 #1
Så løste jeg det selv. Hvis nogen er interesserede i resultatet findes det her:
www.lordpoke.dk/skole/kingo5.php

Og hvis nogen var interesserede i løsningen:
Først en tom array:
$array = array();

Efter udregninger blev der fyldt noget i array'en:

for($i = 0; $i < $rf; $i++) {
  $array[] = FF0000;
  }
for($i = 0; $i < $gf; $i++) {
  $array[] = FFFF00;
  }
if ($graa == '1') {
  $array[] = C0C0C0;
  }

Dernæst blev sandsynlighederne skrevet sammen med en random formel
$ialtrand1 = $ialtf-1;
$rand1 = rand(0 ,$ialtrand1);
$ialtrand2 = $ialtf-2;
$rand2 = rand(0 ,$ialtrand2);
$ialtrand3 = $ialtf-3;
$rand3 = rand(0 ,$ialtrand3);
$ialtrand4 = $ialtf-4;
$rand4 = rand(0 ,$ialtrand4);

Som blev brugt til at tage info ud fra array'en (samtidig med at det der blev taget ud blev slettet, så gentagelser ikke opstår):
  $f1 = $array[$rand1];
  unset($array[$rand1]);
  $array = array_values($array);
  $f2 = $array[$rand2];
  unset($array[$rand2]);
  $array = array_values($array);
  $f3 = $array[$rand3];
  unset($array[$rand3]);
  $array = array_values($array);
  $f4 = $array[$rand4];
  unset($array[$rand4]);
  (...fortsætter selvfølgelig helt til 15)

Det kan godt være at nogen ting kunne havde været lavet nemmere (har på fornemmelsen at jeg på en eller anden måde kunne havde undgået en del gentagelser), men det virker.

-Dennis
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester