Über die Serie
Zunächst einmal können Sie dies wie jede andere Code-Golf-Herausforderung behandeln und beantworten, ohne sich Gedanken über die Serie zu machen. Es gibt jedoch eine Rangliste für alle Herausforderungen. Sie finden die Rangliste zusammen mit weiteren Informationen zur Serie im ersten Beitrag .
Obwohl ich eine Menge Ideen für die Serie habe, sind die zukünftigen Herausforderungen noch nicht in Stein gemeißelt. Wenn Sie Vorschläge haben, teilen Sie mir dies bitte auf dem entsprechenden Sandbox-Post mit .
Loch 2: Zahlen aus einer Normalverteilung
Ich kann nicht glauben, dass dies noch nicht geschehen ist! Sie generieren Zufallszahlen aus einer Normalverteilung . Einige Regeln (die meisten von ihnen werden wahrscheinlich automatisch von den meisten Einreichungen abgedeckt, einige sind jedoch vorhanden, um die Konsistenz der Ergebnisse zwischen sehr unterschiedlichen Sprachen zu gewährleisten):
Sie sollten zwei nicht negative Ganzzahlen als Eingabe verwenden : einen Startwert
S
und die AnzahlN
der zurückzugebenden Zahlen. Die Ausgabe sollte eine Liste vonN
Gleitkommazahlen sein, die aus einer Normalverteilung mit dem Mittelwert 0 und der Varianz 1 erstellt wurden . Immer wenn Ihr Beitrag den gleichen Samen erhältS
, sollte er die gleiche Nummer ergeben. Insbesondere wenn es einmal mit und einmal mit aufgerufen wird , sollten die ersten Einträge der beiden Ausgänge identisch sein. Zusätzlich sollten mindestens 2 16 unterschiedliche Werte unterschiedliche Sequenzen erzeugen.(S, N1)
(S, N2)
min(N1, N2)
S
Sie können jeden eingebauten Zufallszahlengenerator verwenden, der dokumentiert ist, um Zahlen aus einer (ungefähren) gleichmäßigen Verteilung zu ziehen, vorausgesetzt, Sie können
S
sie weitergeben und er unterstützt mindestens 2 16 verschiedene Startwerte. Wenn Sie dies tun, sollte der RNG in der Lage sein, mindestens 2 20 verschiedene Werte für eine bestimmte Nummer zurückzugeben, die Sie von ihm anfordern.- Wenn Ihr verfügbares einheitliches RNG eine geringere Reichweite hat, nicht aussaatfähig ist oder zu wenig Samen enthält, müssen Sie entweder zuerst ein einheitliches RNG mit einer ausreichend großen Reichweite über dem eingebauten RNG aufbauen oder Ihr eigenes geeignetes RNG mit implementieren der Samen. Diese Seite kann hilfreich sein.
- Wenn Sie keinen etablierten Algorithmus zur Erzeugung von Normalverteilungen implementieren, fügen Sie bitte einen Korrektheitsnachweis bei. In beiden Fällen muss der von Ihnen gewählte Algorithmus eine theoretisch genaue Normalverteilung ergeben (mit Ausnahme von Einschränkungen des zugrunde liegenden PRNG- oder Datentyps mit begrenzter Genauigkeit).
- Ihre Implementierung sollte entweder Gleitkommazahlen (mindestens 32 Bit breit) oder Festkommazahlen (mindestens 24 Bit breit) verwenden und zurückgeben, und alle arithmetischen Operationen sollten die volle Breite des ausgewählten Typs verwenden.
- Sie dürfen keine eingebauten Funktionen verwenden, die in direktem Zusammenhang mit der Normalverteilung oder Gaußschen Integralen stehen, wie z. B. die Fehlerfunktion oder deren Inverse.
Sie können ein vollständiges Programm oder eine Funktion schreiben und Eingaben über STDIN, Befehlszeilenargument, Funktionsargument oder Eingabeaufforderung vornehmen und Ausgaben über Rückgabewerte oder durch Drucken an STDOUT (oder die nächstgelegene Alternative) erzeugen.
S
und N
es handelt sich um nicht negative ganze Zahlen mit jeweils weniger als 2 20 . Die Ausgabe kann in einem beliebigen praktischen, eindeutigen Listen- oder Zeichenfolgenformat erfolgen.
Dies ist Codegolf, daher gewinnt die kürzeste Übermittlung (in Byte). Und natürlich wird die kürzeste Einreichung pro Benutzer auch in die Gesamt-Bestenliste der Serie aufgenommen.
Bestenliste
Der erste Beitrag der Serie generiert eine Rangliste.
Um sicherzustellen, dass Ihre Antworten angezeigt werden, beginnen Sie jede Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(Die Sprache wird derzeit nicht angezeigt, das Snippet erfordert sie jedoch und analysiert sie. In Zukunft werde ich möglicherweise eine Bestenliste nach Sprachen hinzufügen.)
Antworten:
Dyalog APL, 33 Bytes
{(.5*⍨¯2×⍟?0)×1○○2×?0}¨⍳⎕⊣⎕rl←1+⎕
Box-Muller :
quelle
⎕rl
,S+1
weil es⎕rl←0
eine besondere Bedeutung hat.+1
, es heißt nur, dass Sie mindestens 2 ^ 16 verschiedene Werte unterstützen müssen. Das korrekte Arbeiten im Bereich [1..2 ^ 16] sollte also in Ordnung sein.R, 68 Bytes
Hierbei wird die
runif()
Funktion verwendet, die zufällige Abweichungen von einer Gleichverteilung erzeugt. Der Startwert für die Zufallszahlengenerierung wird mit angegebenset.seed()
, wobei standardmäßig der Mersenne-Twister-Algorithmus mit einer Periode von 2 ^ 19937-1 verwendet wird.Das Ergebnis ist ein R-Vektor der Länge N, der die berechneten Standardnormalabweichungen enthält.
Hierbei wird die Box-Muller-Methode verwendet: Für zwei unabhängige, einheitliche Zufallsvariablen U und V
quelle
f=
(die Funktion muss nicht unbedingt benannt werden, wenn unbenannte Funktionen in Ihrer Sprache vorkommen).Error: unexpected '}' in "f=fu...
sicher, dass Sie die gleichen ersten Nummern erhalten, wenn Sie anrufenf(0,1)
undf(0,2)
?Dyalog APL,
4234Dies ist eine Funktion, die
S
als linkes Argument undN
als rechtes Argument verwendet wird.Es ist eine Implementierung der Box-Muller-Transformation unter Verwendung des in Dyalog APL integrierten Zufallsoperators
?
, der standardmäßig ein Mersenne-Twister ist, der 64-Bit-Werte zurückgibt. sollte ausreichen.Erläuterung:
⎕RL←⍺
: setze den zufälligen Startwert auf⍺
.?⍵2⍴0
: erzeugt⍵
Zufallszahlenpaare zwischen 0 und 1.{
...}/
: Wende die folgende Funktion auf jedes Paar an:(.5*⍨¯2×⍟⍺)×1○⍵×○2
: berechne denZ0
Wert (sqrt(-2 ln ⍺)×cos(2π⍵)
).quelle
?0
kehrt eine Gleitkommazahl zwischen 0 und 1Perl, 67
Box-Müller wie in anderen Einträgen.
f
Nimmt die Parameter in die richtige ReihenfolgeS, N
.Verwenden:
quelle
Java,
164161 BytesDies nimmt die Eingabe über die Funktion und die Ausgabe über stdout auf. Es verwendet die Box-Muller-Methode.
quelle
s=0;s++<n;
->;n-->0;
?Commodore 64 Basic,
767063 BytesDa der PETSCII-Zeichensatz einige in Unicode nicht vorhandene Symbole enthält, habe ich Ersetzungen vorgenommen:
/
=SHIFT+N
,┌
=SHIFT+O
,●
=SHIFT+Q
,╮
=SHIFT+I
, = ,─
= =SHIFT+E
Dies implementiert die Standard-Box-Muller-Transformation, um die Zahlen zu erzeugen. Ich habe die sin (x) -Hälfte der Transformation ausgewählt, weil Commodore 64 Basic eine zweistellige Abkürzung für hat
sin()
, aber nicht fürcos()
.Obwohl die manuell nichts anderes ergibt, ist der Wert des Arguments
RND
tut Angelegenheit: Wenn eine negative Zahl übergeben wird, der Zufallszahlengenerator ist nicht nur neu ausgesät, ist es wieder ausgesät mit dieser Nummer . Dies macht das Seeding viel einfacher: AnstattPOKE
fünf Speicherplätze zu benötigen , muss ich lediglich einen Notruf tätigenRND
ausführen, wodurch der Code von zwei Zeilen / 121 Byte auf 1 Zeile / 76 Byte reduziert wird.Bearbeiten: Golfed sechs Bytes aus, indem ich erkannte, dass ich die beiden kombinieren könnte
INPUT
Aussagen , und dass der Raum danachTO
optional war.Bearbeiten: Noch sieben Mal Golf gespielt: Commodore Basic hat Pi als eingebaute Konstante und kann sogar auf einer modernen Tastatur eingegeben werden (
SHIFT+PgDn
falls Sie sich fragen).quelle
80386 Maschinencode, 72 Bytes
Hexdump des Codes:
Hier ist der Quellcode (kann von Visual Studio kompiliert werden):
Hier benutze ich einen Lehmer Zufallsgenerator . Es verwendet den folgenden Algorithmus:
Hier ist 4294967291 eine große (2 ^ 32-5) Primzahl, und 116 ist eine kleine (weniger als 128; siehe unten) Zahl, die ihre primitive Wurzel ist . Ich habe eine primitive Wurzel gewählt, die eine mehr oder weniger zufällige Verteilung von Nullen und Einsen in binärer Darstellung hat (01110100). Dieser RNG hat den maximal möglichen Zeitraum von 4294967290, wenn der Startwert ungleich Null ist.
Die relativ kleinen Zahlen, die ich hier verwendet habe (116 und 4294967291, die auch als -5 dargestellt werden können), ermöglichen es mir, die
lea
Befehlscodierung zu nutzen:Es wird zu 3 Bytes zusammengesetzt, wenn die Zahlen in 1 Byte passen.
Die Multiplikation und Division verwenden
edx
undeax
als Arbeitsregister, weshalb ichseed
den zweiten Parameter zur Funktion gemacht habe (fastcall
Aufrufkonvention verwendetedx
, um den zweiten Parameter zu übergeben). Zusätzlich wird der erste Parameter übergebenecx
, der ein guter Platz für einen Zähler ist: Eine Schleife kann in einer Anweisung organisiert werden!Um eine Ganzzahl in eine Gleitkommazahl umzuwandeln, habe ich die Darstellung von Gleitkommazahlen mit einfacher Genauigkeit ausgenutzt: Wenn ich die hohen 9 Bits (Exponenten) auf das Bitmuster setze
001111111
und die 23 niedrigen Bits zufällig belasse, werde ich Erhalte eine Zufallszahl im Bereich 1 ... 2. Ich habe die Idee von hier übernommen . Um die hohen 9 Bits einzustellen, habe ich ein bisschen herumgespieltebx
:Um zwei Zufallszahlen zu generieren, habe ich eine verschachtelte Schleife von 2 Iterationen verwendet. Ich habe es organisiert mit
xor
:Der Gleitkomma-Code implementiert die Box-Muller-Transformation .
quelle
Haskell, 118
144Beispielverwendung:
Der Rückgabetyp von
random
ist auf beschränktFloat
, wodurchrandom
in [0, 1) ein gleichmäßiger Float erzeugt wird. Von da an ist es eine einfache Box-Muller-Formel mit etwas sinnloser Magie für die Listenerstellung.quelle
Golflua, 63
70Golflua Infos und Anleitungen.
Gibt eine Tabelle mit den Werten zurück. In dem von mir verwendeten Beispiel
~T.u( )
ist das dasselbe wiereturn table.unpack( )
in lua.Viele Zeichen wurden gespart, indem die Umgebung der Funktion auf
M
(akamath
) gesetzt wurde.quelle
SAS, 108
Ich habe bereits eine Antwort in R gepostet , die kürzer ist als diese, aber es gibt nur sehr wenige SAS-Antworten auf PPCG. Warum also nicht eine weitere hinzufügen?
Mit etwas Leerraum:
Dies definiert ein Makro, das wie folgt aufgerufen werden kann
%f(5, 3)
. Das Makro führt einen Datenschritt aus, der die ganzen Zahlen 1 bis N durchläuft, und berechnet bei jeder Iteration eine zufällige normale Abweichung mit Box-Muller und druckt sie mit dem in das Protokollput
Anweisung .SAS hat kein eingebautes pi, so dass wir es am besten mit arctangent approximieren können.
Das
ranuni()
Funktion (die veraltet ist, aber ein paar weniger Zeichen benötigt als die neuere Funktion) gibt eine Zufallszahl aus einer Gleichverteilung zurück. Die SAS-Dokumentation enthält außer dem Zeitraum von 2 ^ 31-2 nur wenige Details zur RNG-Implementierung.In SAS-Makros werden Makrovariablen mit einem vorangestellten Verweis versehen
&
Wert und zur Laufzeit in ihre Werte aufgelöst.Wie Sie wahrscheinlich gesehen haben, ist SAS selten ein echter Konkurrent in einem Code-Golf- Wettbewerb.
quelle
Java, 193 Bytes
Dies schlägt zwar nicht den aktuellen Java-Marktführer, aber ich habe mich trotzdem entschieden, einen Beitrag zu verfassen, um eine andere Berechnungsmethode zu zeigen. Es ist eine Golfversion von OpenJDK
nextGaussian()
.Mit Zeilenumbrüchen:
quelle
(s,n)->{java.util.Random r=new java.util.Random(s);for(float a,v;n-->0;System.out.println(v*Math.sqrt(-2*Math.log(a)/a)))for(a=0;a>=1|a==0;a=v*v+(v=2*r.nextFloat()-1)*v)v=2*r.nextFloat()-1;}
T-SQL, 155 Bytes
Verwendung mit EXEC RS, N, da in T-SQL keine STD_IN vorhanden ist, wobei S und N der Startwert bzw. N sind. S wird "zufällige" (RAND (seed) ist eine wirklich schlechte Zufallszahlenimplementierung) Sequenzen erzeugen, wenn S> 2 ^ 16 (möglicherweise vorher, aber ich kann es nicht garantieren). Verwendet Box-Muller wie die meisten bisherigen Lösungen. 8388607 ist 2 ^ 23-1, was hoffentlich 2 ^ 20 verschiedene Werte erzeugen sollte.
quelle
Powershell, 164 Bytes
Wie die meisten Antworten bei Box-Muller. Mit Powershell nicht sehr erfahren, daher wäre jede Hilfe beim Golfen willkommen.
quelle
Ruby, 72 Bytes
Eingabe (als Lambda-Funktion):
Ausgabe:
PS: Ich würde gerne wissen, ob dies weiter golfen werden kann. Ich bin nur ein Anfänger.
quelle
Matlab, 77
Der erste Eingang sollte
n
der zweite seins
.quelle
Oktave,
919688 BytesOder mit Leerzeichen:
Stellen Sie den Samen nach vorne und verwenden Sie die Box-Mueller-Methode.
Anmerkung: Octave ermöglicht die Erzeugung von Arrays mit Zufallszahlen und kann Standardoperationen für diese Arrays verwenden, die Arrayausgaben erzeugen. Der
.*
Operator ist eine elementweise Multiplikation zweier Arrays, um das Ergebnis zu erhalten.quelle
n(0,1)
undn(0,2)
unterschiedliche erste Nummern erhalten, oder?Pyth, 32 Bytes
Wegen der neuen Funktionen, die Pyth jetzt hat, wird jetzt kein Python mehr in Super-Anführungszeichen verwendet. Noch ein Box-Müller.
Dieser Raum am Anfang ist wichtig.
Das Seeding scheint im Online-Interpreter nicht zu funktionieren, funktioniert aber in der lokalen Version einwandfrei.Der Online-Interpreter scheint repariert zu sein. Hier ist ein Permalink: Permalinkquelle
.nZ
), die bei der Beantwortung der Frage nicht implementiert war. (Es wurde heute tatsächlich implementiert.) Daher sollte diese Antwort nicht Teil des Wettbewerbs sein ( meta.codegolf.stackexchange.com/questions/4867/… ).STATA, 85 Bytes
Übernimmt die Eingabe über den Standardeingang (erste Zahl ist S, dann N). Setzt den Startwert auf S. Setzt die Anzahl der Beobachtungen auf N. Erstellt eine Variable und setzt ihren Wert auf den Box-Muller-Transformationswert (danke an @Alex für die Anzeige). Listet dann alle Beobachtungen in einer Tabelle mit der Spaltenüberschrift a und den Beobachtungsnummern daneben auf. Wenn dies nicht in Ordnung ist, lassen Sie es mich wissen und ich kann Überschriften und / oder Beobachtungsnummern entfernen.
quelle
R, 89 Bytes
Ich weiß, dass R schon einmal gemacht wurde, aber ich wollte einen anderen Ansatz zeigen als der Box-Müller, den alle anderen benutzten. Meine Lösung verwendet den zentralen Grenzwertsatz .
quelle
a
in Ihrem Code verwendet werden soll, damit das Ergebnis "fair" ist.)TI-Basic, 74 Bytes
Das
¹
ist eigentlich der inverse Operator.quelle
Perl,
150108107 BytesDies nutzt die Marsaglia Polar Methode . Wird mit f (S, N) aufgerufen.
Verschoben die Zuordnung von
$a
in die Berechnung von$c
.107
Reservenummernspeicher und die Definition von entfernt
$b
.108
150
quelle
Swift,
144142Nichts Schlaues, nur zu sehen, wie Swift funktioniert.
Ich hatte gehofft, ich könnte (0 ... n) .map {} verwenden, aber der Compiler scheint map {} nur zu erkennen, wenn Sie einen Parameter verwenden.
quelle
forEach
wenn Sie keinen Rückgabewert möchten, und ich bin mir ziemlich sicher, dass dies_ in
obligatorisch ist/0xffffffff
für BTWHaskell , 97 Bytes
Probieren Sie es online!
Nur Ihre grundlegende Box-Muller-Transformation auf einer unendlichen Liste von Zufallszahlen.
quelle
Python 3 , 118 Bytes
Probieren Sie es online!
quelle
SmileBASIC, 81 Bytes
Nun, nachdem ich die erste Frage beantwortet habe, muss ich den Rest erledigen ...
Das Erzeugen von Zufallszahlen ist billig, aber das Seeding des RNG verwendet die längste in der Sprache eingebaute Funktion
RANDOMIZE
.Vielleicht gibt es eine Möglichkeit, die Formel zu optimieren. Ich verstehe nicht, wie es erforderlich ist, zwei RNG-Aufrufe zu verwenden.
quelle