Sie erhalten eine Funktion Rand5 (). Diese Funktion gibt vollkommen zufällige (gleichverteilte) Ganzzahlen zwischen 1 und 5 zurück.
Stellen Sie die Funktion Rand7 () bereit, die Rand5 () verwendet, um vollkommen zufällige Ganzzahlen zwischen 1 und 7 zu erzeugen.
code-challenge
math
random
Dan McGrath
quelle
quelle
Antworten:
Java - 61 Zeichen
Testfahrer zur Validierung:
Ergebnisse
quelle
rand5
. Ich habe sie in Maple mit einfacher Matrixalgebra berechnet, aber Sie können es mit Bleistift und Papier in ein paar Minuten tun, wenn Sie wollen. Wie auch immer, Omar hat die gleichen Zahlen (ohne Normalisierungsfaktor) bereits ein paar Tage zuvor in einem Kommentar zu einer anderen Antwort veröffentlicht . (Auch ps., Sie können nur einen Benutzer pro Kommentar @notifizieren, obwohl der Autor des Beitrags in jedem Fall benachrichtigt wird.)Perl - 47 (war 52) Zeichen
Außerdem kann ich den ternären Operator AND recursion verwenden. Bester Tag überhaupt!
OK, 47 Zeichen, wenn du mod anstelle von div verwendest:
quelle
&
Zeichen fallen lassen, um 46 Zeichen zu erhalten (einschließlich des Leerzeichens, das Ihre aktuelle Version auf 48 setzt).JavaScript, 42
Bonus ES5 Sache:
quelle
Ruby - 54 Zeichen (basierend auf der Dan McGrath-Lösung, unter Verwendung einer Schleife)
Ruby - 45 Zeichen (gleiche Lösung mit Rekursion)
quelle
(x=rand5+5*rand5-5)>7?
.In Python:
quelle
In Common Lisp 70 Zeichen:
Die Klammern nehmen mehr Platz ein, als ich möchte.
quelle
(defun rand7()(setq n(-(+(rand5)(* 5(rand5)))5))(if(> n 7)(rand7)n))
(defun rand7()(if(>(setq n(-(+(rand5)(* 5(rand5)))5))7)(rand7)n))
In C / C ++ unter Verwendung Verwerfungsmethode
62 Zeichen.
quelle
while(x>7)
, so dass nur Zahlen im gültigen Bereich genügen würden.Übersetzung nach PHP, aus der Antwort von Dan McGrath.
67 Zeichen.
quelle
R, 34 Zeichen
In R (eine Sprache, die für statistische Berechnungen entwickelt wurde) eine bewusst betrügerische Lösung:
Dank der faulen Auswertung der Argumente habe ich das Semikolon und die geschweiften Klammern entfernt.
Ausgabe über 10 ^ 6 Wiederholungen:
quelle
Rand7=function(){r=Rand5();sample(7)[r]}
Rand7=function(){sample(7)[Rand5()]}
scala,
47, 4059 Zeichen:mit 2 Eingängen von rand5:
Ich multipliziere die erste 1 mit 5 und addiere die zweite. Die meisten Ergebnisse werden ignoriert und führen zu einer neuen Berechnung. Das Ergebnis sollte eine gleichmäßige Verteilung der Werte von 1-25 sein, von denen ich nur die ersten 7 auswähle. Ich könnte die ersten 21 mit einem Modulo akzeptieren, aber das würde zu längerem Code führen.
historischer Code, der fehlgeschlagen ist, aber nicht sehr offensichtlich. Vielen Dank an Ilmari Karonen für den Hinweis:
Vielen Dank an Yoshiteru Takeshita für diesen Scala-2.8.0-Ansatz, der 'sum' so einfach gemacht hat. Meine Lösung vor:
rand5:
quelle
def rand7=(1 to 7).map(_=>rand5).sum%7+1
C ++
C ++ (109)
Golf gespielt
quelle
Übersetzung in Javascript aus der Antwort von Dan McGrath.
62 Zeichen
quelle
function Rand7(){for(x=8;x>7;x=rand5()+5*rand5()-5);return x}
ist etwas kürzer: PJavaScript, 85
Ich weiß, es gibt eine kürzere Antwort, aber ich wollte den Test dieses Puzzles zeigen. Es stellt sich heraus, dass nur Clyde Lobos Antwort unter Verwendung von Dan McGraths Ablehnungsstichprobe korrekt ist (zwischen JS-Antworten).
quelle
С ++
Zahlenverteilung (1000000 Ganzzahlen):
Die durchschnittliche Anzahl der Aufrufe von Rand5 () pro generierter Ganzzahl beträgt ungefähr 2,2 (2 bis 10+).
quelle
In Java (oder C / C ++, nehme ich an)
unter Verwendung der Generationsformel von Alexandru in 65 Zeichen:
unter Verwendung der Generationsformel von Dan McGrath in 60 Zeichen
quelle
Clojure - 58 Zeichen
quelle
Python,
5637 ZeichenEine andere Lösung, die in Python falsch sein kann:
Dies scheint zu einfach zu sein, aber wenn ich versuche:
Ich bekomme eine einigermaßen gleichmäßige Verteilung (alle zwischen 14000 und 14500).
Okay, jetzt, als jemand für diesen Beitrag gestimmt hat: Ist diese Lösung in der Tat richtig? Ich habe das hier mehr gepostet, um die Leute dazu zu bringen, es zu kritisieren. Nun, wenn es richtig ist, wäre meine Golfversion:
Das ergibt 37 Zeichen.
quelle
Java, 65 Zeichen:
quelle
Python, 70 Zeichen
aber völlig richtig aufgrund der Begründung hier .
quelle
Perl, 43 Zeichen, iterative Ablehnungsabtastung
Dies gibt eine Warnung über
Ambiguous use of -rand5 resolved as -&rand5()
, funktioniert aber korrekt. Wenn Sie einen Anruf&
auch auf den zweitenrand5
Anruf vorbereiten , wird der Fehler auf einen Schlag behoben . (Umgekehrt kann der andere&
auch entfernt werden, wennrand5
er mit einem()
Prototyp definiert wurde .)Ps. Die folgende 46-Zeichen-Version ist ungefähr dreimal schneller:
quelle
Java - 66 Zeichen
Länger als die vorherige Routine, aber ich denke, diese gibt gleichmäßig verteilte Zahlen in kürzerer Zeit zurück.
quelle
PostScript (46)
Dies verwendet eine binäre Token-Codierung. Daher hier ein Hexdump:
Zum Ausprobieren können Sie es auch herunterladen .
Hier ist der unbenutzte und kommentierte Code zusammen mit dem Testcode.
quelle
quelle
R (30 Zeichen)
Rand7 definieren:
Da R mit Blick auf statistische Analysen geschrieben wurde, ist diese Aufgabe trivial und ich benutze die eingebaute Funktion
sample
Ersetzung auf TRUE gesetzt ist.Beispielausgabe:
quelle
Groovy
Beispielverteilung über 35.000 Iterationen:
Ist es schlimm, dass es stateful ist?
quelle
Mathematica, 30
quelle
Wie wäre es damit?
quelle
/
Operator Ganzzahlen-Mathematik? Was passiert mit Ihren Ergebnissen, wenn es sich um Dezimal-, Gleitkomma- oder Ganzzahl-Mathematik handelt?[2/25, 4/25, 5/25, 5/25, 5/25, 3/25, 1/25]
. Nicht gerade einheitlich.Java - 54
Verteilungstest:
[1000915, 999689, 999169, 998227, 1001653, 1000419, 999928]
Algorithmus:
> Die Zahlen sind nicht mehr unkorreliert, sondern einzeln perfekt zufällig.
quelle
Ruby (43 Bytes)
Die auf Ruby portierte Lösung von cemper93 ist drei Bytes kürzer;) (34 Bytes)
quelle
C / C ++ - Code Der Kerncode besteht nur aus einer Zeile!
Das srand7 () ist der Same von rand7, muss diese Funktion vor rand7 aufrufen, genauso wie das Aufrufen von srand vor rand in C.
Dies ist eine sehr gute Methode, da sie rand () nur einmal aufruft und keine Schleife, keine zusätzlichen Speicher benötigt.
Lassen Sie es mich erklären: Betrachten Sie ein ganzzahliges Array mit der Größe 5:
Also haben wir die TABELLE, jede von 1-7 erscheint fünfmal darin und hat alle 35 Zahlen, also ist die Wahrscheinlichkeit für jede Zahl 5/35 = 1/7. Und das nächste Mal,
Nach einiger Zeit können wir die gleichmäßige Verteilung von 1-7 erhalten.
Also können wir ein Array zuweisen, um die fünf Elemente von 1-7 durch Verschieben von links nach links wiederherzustellen, und jedes Mal eine Zahl von dem Array von rand5 erhalten. Stattdessen können wir alle sieben Arrays zuvor generieren und sie zirkulär verwenden. Der Code ist auch einfach, hat viele Kurzcodes, die das können.
Wir können jedoch die Eigenschaften von% operation verwenden, sodass die Zeilen in Tabelle 1-7 (rand5 + i)% 7 entsprechen, dh: a = rand ()% 5 + 1 ist rand5 in C-Sprache, b = gi ++ % 7 erzeugt alle Permutationen in der obigen Tabelle und 0 - 6 ersetzen 1 - 7 c = (a + b)% 7 + 1, erzeugt 1 - 7 gleichmäßig. Endlich haben wir diesen Code:
Wir können jedoch beim ersten Aufruf nicht 6 und 7 erhalten, daher benötigen wir einen Startwert, z. B. srand für rand in C / C ++, um die Permutation für den ersten formalen Aufruf zu ändern.
Hier ist der vollständige Code zum Testen:
quelle
6
oder einmal7
anrufen ?int main(){if(rand7()==6) printf("Hello, world!");}
, gibt die Annäherung mit der Schleife "Hallo Welt!" 1 in 7 mal, aber Ihr Code nicht.