Toon posts:

Zeer vreemde bug in "loting-code".

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi, ik heb een code geschreven, waarin "ingeschreven spelers" uit een database worden gehaald. Stel er zitten 9 spelers in de database, dan moet het aantal spelers worden aangevuld tot 16 om een mooie ladder te krijgen. Ik wil, als er geloot wordt, dat de 9 spelers random uit de database worden gehaald. Dan worden er 7 spelers toegevoegd die de waarde "leeg" krijgen. Deze 16 spelers worden dan in een random volgorde tegen elkaar gezet, zo, dat er niet 2 spelers met de waarde "leeg" tegenover elkaar komen te staan (als dat gebeurt, moet de loting opnieuw geschieden).

Ik heb hiertoe de volgende code geschreven: het gekke is echter, dat het 20% van de keren werkt, en 80% van de keren niet. Dus als ik 'm 5 keer probeer uit te voeren via het web, doet ie het 1 keer wel en 4 keer niet. Volgens mij zit er iets fout met het random gebeuren. Zou iemand de code voor mij door willen kijken (het kan superingewikkeld overkomen)?

code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<?
if ($action == "whattodosubmit" &amp;&amp; $whattodo == "loten" &amp;&amp; $test_username == "$username" &amp;&amp; $test_password == "$password")
{
  mysql_connect("","","");
  $query = "SELECT * FROM webdarts_users WHERE geaccepteerd = '1' ORDER BY RAND()";
  $result = mysql("needforgaming", $query);
  $amountofplayers = mysql_num_rows($result);
  $am = $amountofplayers;
  if ($am > 256)
  { print("Er zijn te veel spelers ingeschreven, om het schema van het toernooi te kunnen genereren"); exit; }
  if ($am > 128)
  { $am = 256; }
  elseif ($am > 64)
  { $am = 128; }
  elseif ($am > 32)
  { $am = 64; }
  elseif ($am > 16)
  { $am = 32; }
  elseif ($am > 8)
  { $am = 16; }
  elseif ($am > 4) 
  { $am = 8; }
  elseif ($am > 2)
  { $am = 4; }
  elseif ($am = 2)
  { $am = 2; }
  elseif ($am < 2)
  { print("Er zijn te weinig spelers ingeschreven, om het schema van het toernooi te kunnen genereren"); exit; }
  
  $playernumber = 1;
  $numberofemptyspots = $am - $amountofplayers;
  $amountofspotsnumbered = 0;
  $amountofemptyspotsnumbered = 0;
  $amountofplayersnumbered = 0;
  $am2 = $am + 1;
  $rand1 = 1;
  
  while ($amountofspotsnumbered < $am)
  {
    $randomize = mt_rand($rand1,$am2);
    if ($randomize <= $numberofemptyspots &amp;&amp; $amountofemptyspotsnumbered < $numberofemptyspots)
    {
      ${'playernumber'.$playernumber} = "leeg";
      $amountofspotsnumbered = $amountofspotsnumbered + 1;
      $amountofemptyspotsnumbered = $amountofemptyspotsnumbered + 1;
      $rand1 = $rand1 + 1;
    }
    else
    {
      if ($amountofplayersnumbered < $amountofplayers)
      {
        $row = mysql_fetch_array($result);
        ${'playernumber'.$playernumber} = $row[Nickname];
        $amountofspotsnumbered = $amountofspotsnumbered + 1;
        $amountofplayersnumbered = $amountofplayersnumbered + 1;
        $am2 = $am2 - 1;
      }
      else
      {
        ${'playernumber'.$playernumber} = "leeg";
        $amountofspotsnumbered = $amountofspotsnumbered + 1;
        $amountofemptyspotsnumbered = $amountofemptyspotsnumbered + 1;
        $rand1 = $rand1 + 1;        
      }    
    }
    $playernumber = $playernumber + 1;
    

      $count = 0;
      $counter = 0;
      while ($count < $am)
      {
        $counter = $counter + 1;
        $counter2 = $counter + 1;
        if (${'playernumber'.$counter} == "leeg" &amp;&amp; ${'playernumber'.$counter2} == "leeg")
        {
          $playernumber = 1;
          $amountofspotsnumbered = 0;
          $amountofemptyspotsnumbered = 0;
          $amountofplayersnumbered = 0;
          $counting = 0;
          $counter = 0;
          $halfcounter = 0;
          $am2 = $am + 1;
          $rand1 = 1;
          $count = $am + 1; 
        }
        $counter = $counter + 1;
        $count = $count + 2;
      }

 }


    $amountofcouplesmade = 0;
    $amountofcouplestobemade = $am / 2;
    $couplenumber = 1;
    $playernumber = 1;
    while ($amountofcouplesmade < $amountofcouplestobemade)
    {
      $player1 = ${'playernumber'.$playernumber};
      $playernumber = $playernumber + 1;
      $player2 = ${'playernumber'.$playernumber};
      $playernumber = $playernumber + 1;
      $query = "insert into webdarts_schema (koppel_nummer,speler_nummer_1,speler_nummer_2) VALUES ('$couplenumber','$player1','$player2')";
      $result = mysql("needforgaming",$query);
      $amountofcouplesmade = $amountofcouplesmade + 1;
      $couplenumber = $couplenumber + 1;
    }

?>
 <b><font size="2" color="1566a2">Loting voltooid</font></b><br>

 <br>
  <font size="2" face="Verdana">De loting is succesvol voltooid!</font>

<?php
}
?>

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Zet anders je code even tussen [ php] en [ /php] tags, dat leest wat makkelijker. :)

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Topicstarter
kay, done

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

ik kanniet echt wijs uit die lap code
maar wat wil je nou precies randommen?

Doet iets met Cloud (MS/IBM)


Verwijderd

Topicstarter
Stel er zijn 9 plaatsen opgevuld.
Deze plaatsen moeten worden aangevuld worden tot 16.
Hiervoor zijn 7 lege plaatsen nodig.
Deze 16 plaatsen moeten in de volgende ronde een aantal van 8 plaatsen overhouden, er moeten dus 2 spelers tegen elkaar strijden, waardoor er 1 afvalt. Dit laatste is echter van latere zorg. Eerst moet gezorgd worden dat er daadwerkelijk 8 keer 2 spelers tegen elkaar komen te staan. Wel moet gelden, dat er niet 2 lege plaatsen tegenover elkaar komen te staan. Als dat gebeurd, moet de while loop weer van af voor af aan beginnen, en worden alle variabelen teruggezet naar hun standaardwaarden.

De 9 plaatsen worden random uit de database gehaald. Daar worden 7 plaatsen bijgevoegd.

Deze 16 spelers moeten random door elkaar gehusseld worden.
Dit doe ik door een random getal te nemen tussen 1 en het maximale aantal plaatsen + 1, dus tussen 1 en 17. Als het random getal kleiner of gelijk is aan 7, wordt een speler in de loop de waarde "leeg" meegegeven. Indien groter, wordt deze de waarde van een echte randomspelernaam meegegeven (uit de database).

$playernumber1 wordt benoemd, $playernumber2 wordt benoemd... enz... daarna wordt gecheckt of $playernumber1 = $playernumber2, dan worden de waarden gereseset. Dit gebeurd tot en met $playernumber15 = $playernumber16.

Maar op de een of andere manier werkt dit slechts een klein percentage van de tijd. Waarschijnlijk is er iets mis met de
PHP:
1
2
3
<?
mt_rand($rand1, $am2)
?>

.. (mijn gedachte).

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

ik heb hier nog een stukje random code
uit een eerder probleem van mij hier
misschien kan je er wat mee
dit levert echt random waardes af
PHP:
1
2
3
4
5
6
7
8
9
10
11
<?
$array = array(1,2,3,4,5,6,7,8,9);
$vaal= array();
for($i=0;$i<5;$i++)
{   
    $val = (array_splice($array,intval(rand(0,count($array)-1)),1));   
    print "$val[0]";
    echo "<br>";

}
?>

Doet iets met Cloud (MS/IBM)


Verwijderd

Topicstarter
Hmmm, ik zou niet weten hoe ik dat in m'n script kan verwerken, omdat het aantal random waardes steeds afneemt ($rand1 = $rand1 + 1; als lege wordt aangemaakt) en ($am2 = $am2 - 1; als gewone wordt aangemaakt).

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 13:51

Janoz

Moderator Devschuur®

!litemod

Mijn gedachte :)

1: Dat eerste gedeelte (al die if's) kan makkelijker. Je hebt namelijk gewoon een 2-macht nodig, maar aangezien dat niet je probleem is zal ik daar niet te veel op in gaan.

2: Als je de wedstrijden nou als volgt opbouwd:
Begin met 'thuis-spelers' en vul alle waarden in uit de db. Als je voor alle thuiswedstrijden een thuispeler hebt ingevuld, begin je weer aan het begin en vul je de uitspelers in. Als je spelers 'op' zijn ga je verder met dummyspelers. Als je vervolgens alle uitspelers hebt ingevuld is je eerste niveau klaar, en weet je zeker dat er geen leeg vs leeg wedstrijden zijn.
Nadeel van deze aanpak is dat alle halflege wedstrijden onderaan staan. Dit is echter simpel op te lossen door deze wedstrijden zelf nog ff door elkaar te husselen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • nulkelvin
  • Registratie: Maart 2000
  • Laatst online: 09-06-2021

nulkelvin

ehmm is er nog koffie?

kan je niet eerst alle spelers uit de database plukken, daarna husselen, dan aanvullen tot 16 en dan de eerste helft (waarin zeker spelers zitten en geen lege plekken) tegen de tweede helft laten spelen?

ik wilde dat ik eens een coole sig. kon bedenken.

Pagina: 1