JavaScriptsMathematik

Denk Dir eine Zahl

Ein Rechentrick: Ihr denkt euch eine Zahl, rechnet fünf Schritte mit — und das Script nennt euer Ergebnis.

Kleiner, aber feiner Trick: Ihr denkt euch eine beliebige Zahl, rechnet fünf vom Script vorgegebene Schritte im Kopf mit — und am Ende nennt euch das Script das Ergebnis, obwohl es eure Ausgangszahl nie erfahren hat. Ein netter Zeitvertreib für die eigene Homepage und ein schönes Beispiel dafür, dass hinter „Zauberei" oft nur schlichte Algebra steckt.

So läuft es ab: Ein Klick auf „Los geht's" fordert euch auf, euch eine Zahl zu denken. Danach erscheint mit jedem Klick auf „Weiter" eine neue Anweisung — mal sollt ihr eine Zahl zu eurer Zwischensumme addieren, mal eine abziehen. Nach fünf solchen Schritten sollt ihr eure ursprünglich gedachte Zahl wieder abziehen, und das Script verrät, was herauskommen muss. Rechnet ruhig mit einem Zettel mit, dann geht nichts verloren.

Das Geheimnis dahinter ist schnell gelüftet: Eure Startzahl wird am Ende wieder abgezogen und hebt sich damit vollständig auf. Übrig bleibt nur die Summe der Zahlen, die das Script euch vorgegeben hat — und die kennt es natürlich, denn es hat sie selbst ausgewürfelt. Deshalb funktioniert der Trick mit jeder beliebigen Startzahl, ob 7 oder 7 Millionen. Damit unterwegs keine negativen Zwischensummen entstehen, dreht das Script eine Anweisung notfalls von „subtrahiert" auf „addiert" um.

Sollte euer Ergebnis nicht mit dem des Scripts übereinstimmen, liegt es also nicht am Script, sondern am Kopfrechnen. Wer noch mehr in dieser Richtung sucht: In derselben Kategorie liegen das Gedanken lesen und Die Kamelhändler.

Mathematik Baujahr 2004 läuft in deinem Browser

Rechnet jeden Schritt im Kopf oder auf einem Zettel mit — das Script sieht eure Zahl nicht.

So funktioniert das Script

Das Script hat zwei Teile: schritteBauen() würfelt die fünf Rechenschritte aus und merkt sich nebenbei das Endergebnis, zeigen() blendet die Anweisungen nacheinander ein. Alles steckt in einer sofort ausgeführten Funktion, damit die Variablen im Inneren bleiben. Früher liefen die Anweisungen als alert()-Fenster über den Bildschirm — heute erscheinen sie ruhiger als Textzeilen in der Ausgabefläche.

const today = new Date();
const sec = today.getSeconds() || 30;

new Date() liefert den aktuellen Zeitpunkt, getSeconds() daraus die Sekunde (0 bis 59). Diese Zahl dient als zusätzliche Zufallsquelle für die Größe der Rechenschritte. Das || 30 ist eine kleine Absicherung: In der Sekunde 0 wäre das Produkt sonst immer null und alle Anweisungen lauteten „addiert 0" — dann springt ersatzweise die 30 ein.

let rand1 = 31;
while (rand1 > 30) {
  rand1 = Math.ceil(Math.random() * sec * 100);
}

Hier entsteht die Zahl, mit der gerechnet werden soll. Math.random() liefert eine Zufallszahl zwischen 0 und 1, multipliziert mit sec * 100 ergibt das eine größere Spanne, und Math.ceil() rundet auf eine ganze Zahl auf. Die while-Schleife („solange") wiederholt das so lange, bis ein Wert von höchstens 30 herauskommt — so bleiben die Schritte kopfrechentauglich. Der Startwert 31 sorgt dafür, dass die Schleife garantiert mindestens einmal läuft.

if (rand2 > 0.5) {
  mes = "addiert "; mes1 = " zu "; y = rand1;
} else {
  mes = "subtrahiert "; mes1 = " von "; y = -rand1;
}

Ein zweiter Münzwurf entscheidet, ob addiert oder subtrahiert wird: Math.random() liefert in etwa der Hälfte der Fälle einen Wert über 0,5. Gleichzeitig werden die passenden Textbausteine gesetzt, aus denen später der Satz zusammengebaut wird — und y bekommt beim Subtrahieren ein Minuszeichen.

const x1 = x;
x = x + y;
if (x < 0) {
  mes = "addiert "; mes1 = " zu ";
  x = x1 + rand1;
}

x ist die mitlaufende Summe der Vorgaben — der Wert, den das Script am Ende nennen wird. Bevor gerechnet wird, sichert x1 den alten Stand. Würde die Summe negativ, wird der Schritt kurzerhand ins Positive gedreht: Die Anweisung lautet dann doch „addiert", und x wird aus dem gesicherten Wert neu berechnet. Das hält die Zwischensummen für den Mitrechner angenehm im positiven Bereich.

texte.push("Bitte " + mes + rand1 + mes1 + "eurer Zwischensumme.");

texte ist ein Array, also eine Liste, und push() hängt einen Eintrag hinten an. So sammelt das Script erst alle sieben Zeilen — Einleitung, fünf Rechenschritte, Schlusssatz — und zeigt sie danach eine nach der anderen an. Der fertige Satz entsteht durch simples Aneinanderhängen der Textbausteine mit +.

const zeile = document.createElement("p");
zeile.textContent = schritte[position];
ausgabe.appendChild(zeile);
position++;

zeigen() baut mit createElement("p") einen neuen Absatz, füllt ihn per textContent und hängt ihn mit appendChild() unten an die Ausgabefläche an. Der Zähler position merkt sich, wo ihr gerade seid; ist die letzte Zeile erreicht, springt er zurück auf 0 und der Knopf heißt wieder „Noch einmal" — beim nächsten Klick würfelt das Script frische Zahlen aus.

Zum Anpassen: Die 5 in for (let i = 1; i <= 5; i++) legt fest, wie viele Rechenschritte es gibt, und die 30 in der while-Bedingung, wie groß die Zahlen höchstens werden dürfen. Beides lässt sich gefahrlos ändern — mehr Schritte machen den Trick geheimnisvoller, kleinere Zahlen machen ihn leichter mitzurechnen.

Script für die eigene Homepage

Kopiert euch den kompletten Code und fügt ihn an der Stelle eurer Seite ein, an der das Script erscheinen soll. Er läuft ohne weitere Dateien und ohne fremde Server.

Mehr aus der Kategorie Mathematik