0 Daumen
1,2k Aufrufe

,


ich weiß, dass ich eine "Jeder mit jedem - Rechnung" mit der Gaußschen Summelformel hinbekomme. Aber ich bekomme die Formel nicht so umgebogen, damit ich mit ihr das "Jeder mit Jedem - Prinzip" in gleich große Teilschritte unterteilen kann.

Beispiel:

Ich habe 40 Leute, die miteinander anstoßen: 40 * 39 / 2 = 780
780 mal erklingen Gläser. Soweit alles klar.

Jetzt möchte ich das aber z. B. in 4 Schritte aufteilen. Zuerst probierte ich es mit 10 Leuten, die jeweils mit allen anderen anstoßen sollen, aber dabei klingen Gläser natürlich alle 4 Mal unterschiedlich oft. Und eine Formel dafür finde ich auch nicht, denn die (für mich) naheliegenste Variante funktionierte nicht:
40 / 4 = 10 -> Leute pro Schritt, die mit allen anderen verbliebenen Leuten anstoßen
Und dann je übrige Leute - 10
(10 * 39 / 2) + (10 * 29 / 2) + (10 * 19 / 2) + (10 * 9 / 2) = 480
Aber eine solche Formel ist für mich im Moment zweitrangig (aber auch interessant).

780 / 4 = 195
So oft soll es in jedem der vier Schritte klingen.
Wie muss die Formel aussehen um auszurechnen, wie viele Leute in jedem Schritt aktiv werden müssen, damit es in jedem Schritt (annähernd, Dezimalzahl erlaubt) gleich oft klingt?



Zer0

Avatar von

Die gleichmäßigste Verteilung bekommst du, wenn du zunächst 5 Leute, dann 6, dann 8 und dann den Rest mit allen anstoßen lässt (185 + 189 + 196 + 210  =  780).

Ok, aber wie packe ich das in eine Formel? Je nach Gesamtzahl der Leute und Anzahl der Teilschritte (soll beides variabel bleiben) ist ja selbst die prozentuale Verteilung eine andere.

Je nach Gesamtzahl der Leute (n_0) und Anzahl der Teilschritte (m_0) (soll beides variabel bleiben)

Die Anzahlen der Leute, die in jeder Runde antreten, bekommst du jeweils als die auf ganze Zahl gerundete positive Lösung der Gleichung  x·(n-x) + x·(x-1)/2  =  n·(n-1)/2 / m .

Für die erste Runde ergibt sich die Anzahl a aus  n = n_0  und  m = m_0 .
Für die zweite Runde ergibt sich die Anzahl b aus  n = n_0 - a  und  m = m_0 - 1 .
Für die dritte Runde ergibt sich die Anzahl c aus  n = n_0 - (a+b)  und  m = m_0 - 2 .
Für die vierte Runde ergibt sich die Anzahl d aus  n = n_0 - (a+b+c)  und  m = m_0 - 3 .

Und so weiter, in der letzten Runde stoßen die Verbliebenen nur noch untereinander an.

Vielen, vielen Dank dafür. War doch etwas komplexer, als ursprünglich angenommen. Doch durch Umstellung deiner Formel, kann ich das nun als Code verwenden. Ich bringe mir das Programmieren bei und versuche mich gerade an Multithreading. Dadurch, dass ich meine Vergleichsfunktion dank dir nun gleichmäßiger auf die Prozessorkerne verteilen kann, gewinnt mein Testprogramm rund 10% mehr Performance (bei 21025 "Leuten").

Für Interessierte, so sieht der Test-Code mit der umgestellten Formel aus:

const l = 21025;
const m = 4;
for (let i = 0, sum = 0; i < m; i++) {
    const test = Math.round(-(Math.sqrt(((l - sum) ** 2) - (((l - sum) * (l - sum - 1) / 2) / (m - i)) * 2)) + l - sum);
    sum += test;
    console.log(test);
    console.log(test * (l - (sum - test) - test) + test * (test - 1) / 2);
}

Als Ergebnis kommt heraus (je "Anzahl Leute" und "klingende Gläser" pro Schritt):

2817
55258272

3341
55250117

4354
55250083

10410
55251075

1 Antwort

+1 Daumen

Zuerst probierte ich es mit 10 Leuten, die jeweils mit allen anderen anstoßen sollen.

\( \frac{(39+30)·10}{2} \) mal klingen dann die Gläser.

Avatar von 123 k 🚀

Vielen Dank. Ich konnte deine Formel so umbauen, dass es variabel mit verschiedenen Anzahlen von Leuten und Teilschritten funktioniert.

((leuteAnzahl / schritte * schritt - 1) + (leuteAnzahl / schritte * schritt - leuteAnzahl / schritte)) * leuteAnzahl / schritte / 2

Damit ist eine von zwei Fragen geklärt.

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Mathelounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community