[PHP]Losowanie pary liczb bez powtorzen

0

Witam kolezanki i kolegow z forum.
Od pewnego czasu zastanawiam sie nad skonstruowaniem wydajnego generatora terminarza lig bowlingowych.
Powiedzmy, ze mamy 8 druzyn (z opcja liczby nieparzystej, np moze byc 9 druzyn - wowczas jedna druzyna pauzuje) wiec z tego mamy siedem spotkan podczas ktorych:

  • kazda druzyna moze zagrac z inna druzyna tylko jeden raz
  • kazda druzyna moze zagrac tylko jeden raz na danym torze

Generalnie stworzenie tablicy, aby kazda druzyna zagrala z kazda nie jest az takim problemem, ale czy macie moze jakies pomysly lub spotkaliscie sie z tym problemem jak wydajnie stworzyc tablice dobierajac pary aby kazdy zagral z kazdym przy jednoczesnym wystapieniu tylko raz na danym miejscu w parze, czyli np

  • rozstawienie par druzyn spotkania 1 - (1,2), (3,4), (5,6), (7,8) - wiec w reszcie spotkan druzyna 1 nie moze spotkac sie juz z druzyna 2 (i odwrotnie) ani druzyna 1 nie moze zagrac juz na torze nr 1 a druzyna 2 na torze 2 itd.

Za wszelkie pomysly, podpowiedzi serdecznie dziekuje

0

Załóżmy, że ilość drużyn jest parzysta (2k). (Jeśli jest nieparzysta, to stosujemy ten sam algorytm, żadna drużyna nie dostaje wtedy numeru 2k).
Przykład dla 8 drużyn
Pierwsza runda:
1 - 8
2 - 7
3 - 6
4 - 5
Druga runda:
8 - 5
1 - 6
2 - 5
3 - 4
Trzecia runda:
2 - 8
3 - 1
4 - 7
5 - 6
Zasada jest taka: pierwszą parę tworzą w kolejnych rundach: 1-2k, 2k-(k+1), 2-2k,... Jak już masz pierwszą parę, to pozostałe numery piszesz cyklicznie, wpierw w dół, potem w górę.
Przykładowo tworzymy piąta rundę
3 - 8
po dopisaniu "w dół" mamy
3 - 8
4 -
5 -
6 -
po dopisaniu "w górę"
3 - 8
4 - 2
5 - 1
6 - 7
Mogę zamieścić implementację w Javie.

0

Hmm Twoje rozwiazanie nie jest takie o jakie mi chodzilo poniewaz druzyna z numerem 8 owszem zagra w kazdej rundzie z kims innym ale wynika z tego ze bedzie grala na tym samym torze wiecej niz 1 raz a chodzi o to aby grala zawsze z kims innym ale tylko raz na danym torze. Czyli wg twojego
Pierwsza runda:
1 - 8
2 - 7
3 - 6
4 - 5
Trzecia runda:
2 - 8
3 - 1
4 - 7
5 - 6
Piąta runda
3 - 8
4 - 2
5 - 1
6 - 7
Moze jakies inne pomysly?

0

Przeoczyłem wymóg zmiany toru, a Ty nie podałeś kluczowej informacji: ile jest torów.

0

Zakladamy ze kazda para ma swoja pare torow czyli 8 druzyn 8 torow

0
bo napisał(a):

Załóżmy, że ilość drużyn jest parzysta (2k). (Jeśli jest nieparzysta, to stosujemy ten sam algorytm, żadna drużyna nie dostaje wtedy numeru 2k).
Przykład dla 8 drużyn
Pierwsza runda:
1 - 8
2 - 7
3 - 6
4 - 5
Druga runda:
8 - 5
1 - 6
2 - 5
3 - 4
Trzecia runda:
2 - 8
3 - 1
4 - 7
5 - 6
Zasada jest taka: pierwszą parę tworzą w kolejnych rundach: 1-2k, 2k-(k+1), 2-2k,... Jak już masz pierwszą parę, to pozostałe numery piszesz cyklicznie, wpierw w dół, potem w górę.
Przykładowo tworzymy piąta rundę
3 - 8
po dopisaniu "w dół" mamy
3 - 8
4 -
5 -
6 -
po dopisaniu "w górę"
3 - 8
4 - 2
5 - 1
6 - 7
Mogę zamieścić implementację w Javie.

Kolego, czy możesz zamieścić implementacje w Javie?

pozdrawiam

0

tak, na pewno niezarejestrowany członek forum siedzi i od 2 lat czeka, aż ktoś odpowie w tym temacie.. (jeszcze zarejestrowany to ok, a nuż ma powiadomienia..)

1
/*  Program tworzy terminarz rozgrywek ligowych
    Użycie: java Terminarz [ileDrużyn]  domyślnie ileDrużyn=10
 */
public class Terminarz
{
    public static void main(String[] args)
    {
        int ile = 10;
        if(args.length>0)
        {
            try
            {
                ile = Integer.parseInt(args[0]);
                if(ile%2 == 1)
                {
                    System.out.println("Ilość drużyn musi być parzysta");
                    System.exit(0);
                }
            }
            catch(Exception e)
            {
            }
        }
        int[][][] pary = new int[ile-1][ile/2][2];
        int w;
        for (int i=1;i<ile;i++)
        {
            if(i<=ile/2)
            {
                pary[2*i-2][0][0] = i;
                pary[2*i-2][0][1] = ile;
                w = 2*i-2;
            }
            else
            {
                pary[2*i-1-ile][0][1] = i;
                pary[2*i-1-ile][0][0] = ile;
                w = 2*i-1-ile;
            }
            int j = i+1;
            for (int k=1;k<=ile-2;k++)
            {
                if(j >= ile)
                {
                    j = 1;
                }
                if(k <= (ile-2)/2)
                {   
                    pary[w][k][0] = j;
                }
                else
                {
                    pary[w][ile-1-k][1] = j;
                }
                j++;
            }
        }
        for (int i=1;i<ile;i++)
        {
            for (int j=0;j<ile/2;j++)
            {
                System.out.print(pary[i-1][j][0]+"-"+pary[i-1][j][1]+"\t");
            }
            System.out.println("");
        }
    }
}
0

Witam kolegów i koleżanki.
Ja mam takie pytanie jakby to wyglądało w PHP ?

Pozdrawiam,
Aśka

1
<?php
	// ile drużyn
	$ile = 6;
	echo 'druzyn: <b>'.$ile.'</b><hr />';

	$pary = array(($ile-1), ($ile/2));
	echo 'kolejek: <b>'.$pary[0].'</b><br />';
	echo 'meczow w kolejce: <b>'.$pary[1].'</b><hr />';

	for($i=1; $i<$ile; $i++) {
		if($i <= $ile/2) {
			$para[2*$i-2][0][0] = $i;
			$para[2*$i-2][0][1] = $ile;
         $w = 2*$i-2;
      } else {
      	$para[2*$i-1-$ile][0][1] = $i;
			$para[2*$i-1-$ile][0][0] = $ile;
         $w = 2*$i-1-$ile;
      }

      $j = $i+1;

      for($k=1; $k<=$ile-2; $k++) {
      	if($j >= $ile) {
      		$j = 1;
      	}
         if($k <= ($ile-2)/2) {
         	$para[$w][$k][0] = $j;
         } else {
         	$para[$w][$ile-1-$k][1] = $j;
         }
         $j++;
      }
   }

   for($i=1; $i<$ile; $i++) {
   	echo '<b>kolejka '.$i.'</b><br />';
   	for($j=0; $j<$ile/2; $j++) {
   		echo $para[$i-1][$j][0]."-".$para[$i-1][$j][1]."</br />";
   	}
   	echo "<br />";
   }

   echo '<hr /><pre>';
   var_dump($para);
   echo '</pre>';
?>
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1