Ihr Programm / Funktion sollte
- gibt genau eine ganze Zahl aus
- Gibt eine beliebige Ganzzahl mit positiver Wahrscheinlichkeit aus
- Geben Sie eine ganze Zahl größer als 1.000.000 oder kleiner als -1.000.000 mit einer Wahrscheinlichkeit von mindestens 50% aus.
Beispielausgaben (alle müssen möglich sein):
59875669123
12
-42
-4640055890
0
2014
12
24
-7190464664658648640055894646646586486400558904644646646586486400558904646649001
Klarstellungen:
- Ein abschließender Zeilenumbruch ist zulässig.
- Führende Nullen sind nicht erlaubt.
-0
ist erlaubt.
Kürzester Code gewinnt.
way too long to fit in an integer
- Dies gilt nur, wenn Sie davon ausgehen, dassinteger
dies derint
Datentyp in einem 32/64-Bit-Bogen ist, was nicht unbedingt eine gültige Annahme ist. "Integer" wurde als mathematischer Ausdruck gestartet , für den keine Größenbeschränkungen gelten.Antworten:
CJam,
161413 BytesDies dauert sehr lange, da der aktuelle Zeitstempel (in der Größenordnung von 10 bis 12 ) verwendet wird, um zu bestimmen, ob die Schleife beendet werden soll. Ich verwende dies als Vorlage, da es die kürzeste ist, aber es gibt zwei 14-Byte-Alternativen, die ihre eigenen Vorzüge haben:
Dieser ist nicht durch den Zeitraum des PRNG begrenzt, da der Bereich aller Zufallszahlen vom aktuellen Zeitstempel abhängt. Daher sollte dies in der Lage sein, eine beliebige Zahl zu erzeugen, obwohl die Wahrscheinlichkeit für negative oder sogar kleine positive Zahlen verschwindend gering ist.
Unten finden Sie eine entsprechende Version, die
3e5
anstelle des Zeitstempels verwendet wird. Und20
für den ersten Bereich (als 13-Byte-Übermittlung). Es ist viel schneller und entspricht auch allen Regeln. Es ist eine Art Grenzfall, die 50% -Wahrscheinlichkeit für Zahlen über 1.000.000 zu erhalten, während eine angemessene Laufzeit und eine kleine Codegröße beibehalten werden. Die Erklärung und mathematische Begründung beziehen sich auf diese Version:Dies dauert normalerweise einige Sekunden. Sie können das
5
durch ein ersetzen2
, damit es noch schneller läuft. Dann wird die Anforderung an die 50% -Wahrscheinlichkeit jedoch nur für 1.000 statt 1.000.000 erfüllt.Ich fange bei 0 an. Dann habe ich eine Schleife, aus der ich mit Wahrscheinlichkeit 1 / (3 * 10 5 ) ausbreche . Innerhalb dieser Schleife füge ich meiner laufenden Summe eine zufällige ganze Zahl zwischen -1 und 18 (einschließlich) hinzu. Es gibt eine begrenzte (wenn auch geringe) Wahrscheinlichkeit, dass jede Ganzzahl ausgegeben wird, wobei positive Ganzzahlen viel wahrscheinlicher sind als negative (ich glaube nicht, dass Sie in Ihrem Leben eine negative sehen werden). Wenn Sie mit einer so geringen Wahrscheinlichkeit ausbrechen und die meiste Zeit inkrementieren (und viel mehr addieren als subtrahieren), werden Sie in der Regel über 1.000.000 hinausgehen.
Eine mathematische Begründung:
Die Wahrscheinlichkeit, dass wir weniger als diese Anzahl von Schritten machen, ist
die auswertet zu
0.324402
. Daher werden wir in etwa zwei Dritteln der Fälle mehr als 117.647 Schritte ausführen, und zwar jeweils 1.000.000.9e9
ohne irgendwelche Bytes hinzuzufügen (aber Jahre Laufzeit).... oder 11 Bytes?
Schließlich gibt es eine 11-Byte-Version, die auch nicht durch die PRNG-Zeit begrenzt ist, sondern die jedes Mal so gut wie keinen Speicher mehr hat. Es wird nur eine Zufallszahl (basierend auf dem Zeitstempel) pro Iteration generiert und sowohl zum Inkrementieren als auch zum Beenden verwendet. Die Ergebnisse jeder Iteration verbleiben auf dem Stapel und werden erst am Ende aufsummiert. Vielen Dank an Dennis für diese Idee:
quelle
Kmr
in einer Periode ist wahrscheinlich immer eine große positive Zahl, die größer als die Periode ist. Und in diesem Fall kann nicht jede mögliche Zahl erzeugt werden.Java,
133,149Beispielausgaben
Ungolfed
Alte Antwort (vor Regeländerung)
quelle
-
.Mathematica - 47
Generieren Sie einfach eine Zufallszahl unter Verwendung der Normalverteilung mit einer Varianz von 1500000. Dies ergibt eine ganze Zahl zwischen -10 ^ 6 und 10 ^ 6 mit einer Wahrscheinlichkeit von 49,5015%.
quelle
Python 2,
7569 BytesEs ist trivial zu prüfen, ob die while-Schleife in der Mitte alle ganzen Zahlen erzeugen kann (wenn auch in Richtung Null voreingenommen). "12" wird so gewählt, dass ungefähr die Hälfte der Zahlen ± 10 6 überschreitet .
Ältere Lösung:
Python 2, 44 BytesBasierend auf der Mathematica-Lösung .Funktioniert nicht wirklich, da Pythons
float
nur endliche Präzision hat.quelle
Rubin, 70
Um die Erzeugung sehr großer Zahlen zu ermöglichen, gebe ich die Zahl als eine
String
von einem Lambda zurück. Wenn dies nicht zulässig ist, zählen Sie 8 zusätzliche Zeichen (fürputs f[]
), um es zu einem Programm anstelle einer Funktion zu machen.Erläuterung
Generiere eine Zahl zwischen
-1,000,000
und1,000,000
. Wenn die Zahl1
größer oder gleich ist, wird die Zahl als a zurückgegebenString
.Ist die Zahl kleiner als
1
, wird die Funktion rekursiv aufgerufen, um eine Zahl außerhalb des Nummernkreises zurückzugeben. Um sicherzustellen, dass auch negative Zahlen generiert werden können,-
wird dem Ergebnis ein vorangestellt,String
wenn die Anfangszahl größer als ist-500,000
.Ich hoffe ich habe die Herausforderung richtig verstanden!
quelle
R 38
Ziehungen aus der Gaußschen Verteilung mit einem zufällig ausgewählten Mittelwert von 2.000.000 und einer Standardabweichung von 1.000.000, sodass etwa 2/3 der Ziehungen innerhalb von 1.000.000 und 3.000.000 liegen. Die Verteilung ist unbegrenzt, so dass theoretisch jede beliebige ganze Zahl generiert werden kann. Das Rmpfr-Paket ersetzt Rs eingebaute Doppelschwimmer mit beliebiger Genauigkeit.
quelle
sample(c(1,-1),1)
überlegen müssen. Nur um 1e6 zu zentrieren sollte ausreichen.Perl, 53 Zeichen
Ich sehe keinen Grund, mit ganzen Zahlen zu arbeiten, wenn ich eine drucke :)
Hat die gleiche Wahrscheinlichkeit, eine Zahl mit oder ohne vorangestelltem "-" zu drucken.
Druckt 10% der Zeit eine 1-stellige Zahl, 9% der Zeit eine 2-stellige Zahl, 8,1% der Zeit eine 3-stellige Zahl, 7,29% der Zeit eine 4-stellige Zahl und 5-stellige Zahl 6,56% der Zeit, eine 6-stellige Zahl 5,9% der Zeit usw. Jede Länge ist mit abnehmender Wahrscheinlichkeit möglich. Die Zahlen mit einer bis fünf Ziffern machen ungefähr 41,5% der Ausgabefälle aus, und die Zahl 1.000.000 (oder -1.000.000) macht nur 6-millionstel Prozent aus, so dass die Ausgabezahl außerhalb des Bereichs von -1.000.000 bis 1.000.000 bei 54,6 liegt % der ganzen Zeit.
Sowohl "0" als auch "-0" sind mögliche Ausgaben, von denen ich hoffe, dass sie kein Problem sind.
quelle
print int(rand(20)-10)||1
. Ich brauche eine Möglichkeit, um 0 als Ausgabe zu generieren. Vielleicht || stirb 0, wenn der nachfolgende Müll nach der Null erlaubt ist. Andernfalls brauchen Sie einen kurzen Weg, um die Null zu drucken und ohne weitere Ausgabe zu beenden, wennint(rand(20)-10)==0
.Perl, 114 Zeichen
Nervenzusammenbruch:
Die Wahrscheinlichkeit, einen Wert zwischen -1.000.000 und 1.000.000 zu erhalten, tendiert gegen Null, ABER es ist möglich.
Perl, 25Erzeugt eine zufällige Ganzzahl im Bereich von +/- 2 ^ 99.
Nervenzusammenbruch
Getestet mit 1 Million Proben:
Dies erfüllt alle Regeln:
Bearbeiten:
Ich musste den Exponenten erhöhen, damit größere ganze Zahlen generiert werden. Ich habe 99 gewählt, weil der Code so kurz wie möglich ist.quelle
-2^31
und+2^31-1
(32 Bit). Sie können die Exponenten leicht erhöhen, wenn Sie größere Ganzzahlen generieren möchten, dies kann jedoch je nach Implementierung von Perl fehlschlagen.1.#INF
um genau zu sein)C #,
126107 BytesUngolfed:
Die Wahrscheinlichkeit, eine Anzahl von n Ziffern zu generieren , ist 1/2 ^ (n-10), was für alle positiven n größer als 0 ist, und 1/2 für n = 11.
Erstellt auch führende Nullen, die in der ursprünglichen Frage oder einem ihrer Kommentare nicht unzulässig zu sein scheinen.quelle
using System;
brauchen Sie nichtSystem.Random
zweimal, sondern nurRandom
, richtig?using
Anweisungen verwenden. Es würde sowieso nur 1 Zeichen sparen.-1E6, 1E6+1
.Perl, 62 Bytes
print $n=int rand(20)-10;while($n&&rand>.1){print int rand 10}
Ich hatte die gleiche Idee wie @Hobbs, eine Ziffer nach der anderen zu generieren, aber sein Code erfüllte nicht die Anforderung, keine führenden Nullen zu setzen. Das Erzeugen der ersten Ziffer anstelle nur des Vorzeichens löste das. Und es sei denn, es gibt einen kürzeren Weg zum Beenden, wenn wir eine Null gedruckt haben, oder einen kürzeren Weg zum Generieren der führenden -9 bis 9, sollte dies für die Größe der Fall sein.
In einer Shell-Schleife:
while perl -e '...'; do echo;done |less
Ich denke, dies ist eine der kürzesten, die nicht unendlich RAM benötigt, um das Problem zu lösen. Als Bonus ist die Ausgabe nicht stark auf irgendetwas ausgerichtet, und die Laufzeit ist sehr schnell.
Ich habe versucht, bitweise zu verwenden und ein Zeichen in der while-Bedingung zu speichern, aber ich denke, dass dies häufiger zutrifft, sodass die Schleife früher endet. Wäre mehr Zeichen erforderlich, um andere Dinge anzupassen, um dem entgegenzuwirken, um die Wahrscheinlichkeit für die Erzeugung von abs (Output)> 1M beizubehalten.
quelle
Javascript (73)
Diese Lösung verwendet, dass Sie eine Zahl mit der Basis n konstruieren können, indem Sie die vorherige Zahl mit n multiplizieren und eine Ziffer zur Basis n hinzufügen . Wir haben ein zusätzliches
..?..:..
Element, um alle negativen Ganzzahlen erstellen zu können. Der folgende Code sollte in einer Browserkonsole getestet werden.Die Wahrscheinlichkeit, eine Ganzzahl> =
2^1
(oder <=-(2^1)
) zu erhalten, entspricht der Wahrscheinlichkeit, dass die Schleife zweimal ausgeführt wird. Die Chance dafür ist(98/99)^2
. Die Chance, eine Zahl zu erhalten, die größer als2^20
(oder <=-(2^20)
) ist, beträgt daher(98/99)^21 = 0.808
oder 81%. Dies ist jedoch alles in der Theorie und unter der Annahme, dass Math.random wirklich zufällig ist. Es ist offensichtlich nicht.Snippet, das diesen Code testet. Auch lesbarer.
Code-Snippet anzeigen
quelle
GolfScript, 20 Bytes
Ja, dieser ist auch ein bisschen langsam.
Im Vergleich zu Sprachen wie CJam und Pyth leidet GolfScript unter einem wortreichen Schlüsselwort zur Erzeugung von Zufallszahlen (
rand
). Um dieses Handicap zu überwinden, musste ich einen Weg finden, es nur einmal zu benutzen.Bei diesem Code wird wiederholt eine Zufallszahl zwischen 0 und 8 8 -1 = einschließlich 16.777.215 ausgewählt und ein Zähler inkrementiert, bis die Zufallszahl zufällig 0 ist. Der resultierende Zählerwert hat eine geometrische Verteilung mit einem Median von ungefähr -1 / log 2 (1 - 1/8 8 ) ≈ 11.629.080, so dass der Test "über 1.000.000 mindestens 50% der Zeit" erfüllt wird.
Leider ist die so erzeugte Zufallszahl immer streng positiv. Daher wird der zusätzliche
.2&(*4/
Teil benötigt, damit er negativ oder null wird. Es funktioniert, indem es das zweitniedrigste Bit der Zahl extrahiert (was entweder 0 oder 2 ist), es dekrementiert, um es zu -1 oder 1 zu machen, es mit der ursprünglichen Zahl multipliziert und das Ergebnis durch 4 dividiert (um es loszuwerden) die niedrigsten zwei Bits, die jetzt mit dem Vorzeichen korreliert sind, und auch, damit das Ergebnis Null wird). Auch nach der Division durch 4 hat der Absolutwert der Zufallszahl noch einen Median von -1 / log 2 (1 - 1/8 8 ) / 4 ≈ 2.907.270, sodass er den 50% -Test weiterhin besteht.quelle
JavaScript, 81 Byte
Dieser Code erfüllt alle Regeln:
0
in der AusgabeAls Bonus wird der Algorithmus mit einer Zeitkomplexität von O (log 10 n) ausgeführt, sodass die Ganzzahl fast sofort zurückgegeben wird.
Dies setzt eine REPL-Umgebung voraus. Versuchen Sie, den obigen Code in der Konsole Ihres Browsers auszuführen, oder verwenden Sie das folgende Stack-Snippet:
Algorithmus :
s
bis aMath.random() > 0.1
.Math.random() > 0.5
machen Sie die Zahl negativ (indem Sie den Strings
mit voranstellen-
).Dieser Algorithmus hat keine einheitliche Verteilung über alle ganzen Zahlen. Ganzzahlen mit einer höheren Stellenzahl sind weniger wahrscheinlich als die niedrigeren. In jeder for-Schleifeniteration besteht eine 10% ige Chance, dass ich bei der aktuellen Ziffer anhalte. Ich muss nur sicherstellen, dass ich in mehr als 50% der Fälle nach 6 Ziffern aufhöre.
Diese Gleichung von @nutki erklärt den Maximalwert des Prozentsatzes der Stopp-Chance basierend auf der obigen Bedingung:
Somit ist 0,1 in einem guten Bereich, um alle drei Regeln der Frage zu erfüllen.
quelle
TI-BASIC, 14 Bytes
Ähnlich wie bei der R-Antwort von @ ssdecontrol ergibt sich dies aus der Gaußschen Verteilung mit einem zufällig gewählten Mittelwert von -1.000.000 oder 1.000.000 und der Standardabweichung 9. Die Verteilung ist unbegrenzt, sodass theoretisch jede ganze Zahl generiert werden kann.
Erklärung :
quelle
:
bedeutet "Drucken" aufgrund der Darstellung der Erklärung). Aber kann es Zahlen mit mehr als 20 Stellen erzeugen?randNorm
?Bash, 66
Fast immer wird 5000000 gedruckt. Wenn jedoch eine gültige Nummer in gefunden wurde
/dev/random
, wird diese Nummer stattdessen gedruckt.Und dieser ist schneller:
quelle
/dev/urandom
dem es weniger zufällig ist./dev/urandom
in einem Shell-Skript ist im Grunde dasselbe wie das Aufrufenrand()
in anderen Sprachen. Obwohl, wenn Sie wirklich bash verwenden, nicht POSIX sh, können Sie Zufallszahlen von erhaltenecho $RANDOM
. wiki.ubuntu.com/DashAsBinSh gibthexdump /dev/urandom
als Äquivalent für das absolute POSIX-Minimum an/bin/dash
.C ++, 95 Bytes
Erweitert:
Erläuterung:
Die Funktion druckt so lange aufeinanderfolgende zufällige Ziffern, bis ein Schalter mit zufälligen Werten den zum Stoppen der Funktion erforderlichen Wert annimmt. d ist die Variable, die den Wert der nächsten zu druckenden Ziffer beibehält. s ist die Schaltvariable, die im Intervall [0, 9] ganzzahlige Zufallswerte annimmt. Wenn s == 9, werden keine Ziffern mehr gedruckt und die Funktion endet.
Die Variablen d und s werden initialisiert, um der ersten Ziffer eine besondere Behandlung zu geben (sie wird aus dem Intervall [-9, 9] entnommen, und wenn die erste Ziffer Null ist, muss die Funktion beendet werden, um führende Nullen zu vermeiden). Der Wert von d könnte als d = rand ()% 10 zugewiesen werden, aber dann könnte die erste Ziffer nicht negativ sein. d wird stattdessen als d = (rand ()% 19 + d + 9)% 10 zugewiesen und bei -18 initialisiert, sodass der erste Wert von d zwischen [-9, 9] und der nächste Wert immer zwischen [0] liegt 9].
Die Variable s reicht zufällig von [0, 9], und wenn s gleich 9 ist, endet die Funktion. Nach dem Ausdruck der ersten Ziffer wird die nächste mit einer Wahrscheinlichkeit von 90% ausgegeben (vorausgesetzt, rand () ist wirklich zufällig, und um die dritte Bedingung zu erfüllen). s könnte leicht als s = rand ()% 10 zugewiesen werden. Es gibt jedoch eine Ausnahme: Wenn die erste Ziffer Null ist, muss die Funktion enden. Um eine solche Ausnahme zu behandeln, wurde s als s = 9-rand ()% 10 * min (d * d + s + 1,1) zugewiesen und als -1 initialisiert. Wenn die erste Ziffer Null ist, gibt das min 0 zurück und s entspricht 9-0 = 9. Die Zuweisung der Variablen reicht immer von [0, 9], sodass die Ausnahme nur bei der ersten Ziffer auftreten kann.
Merkmale (unter der Annahme, dass rand () wirklich zufällig ist)
Die Ganzzahl wird ziffernweise mit einer festen Wahrscheinlichkeit von 90% für das Drucken einer weiteren Ziffer nach dem Drucken der letzten Ziffer gedruckt.
0 ist die Ganzzahl mit der höchsten Wahrscheinlichkeit, gedruckt zu werden, mit einer Wahrscheinlichkeit von ungefähr 5,2%.
Die Wahrscheinlichkeit, eine ganze Zahl im Intervall [-10 ^ 6, 10 ^ 6] zu drucken, beträgt ungefähr 44% (die Berechnung wird hier nicht geschrieben).
Positive und negative Ganzzahlen werden mit der gleichen Wahrscheinlichkeit gedruckt (~ 47,4%).
Nicht alle Ziffern werden mit der gleichen Wahrscheinlichkeit gedruckt. Beispiel: Wenn in der Mitte der Ausgabe der Ganzzahl die letzte Ziffer 5 war, hat die Ziffer 3 eine etwas geringere Chance, als nächstes gedruckt zu werden. Wenn die letzte Ziffer d war, hat die Ziffer (d + 18)% 10 im Allgemeinen eine etwas geringere Chance, als nächstes gedruckt zu werden.
Beispielausgaben (10 Ausführungen)
quelle
Bash, 42 Bytes
printf "%d\n" 0x$(xxd -p -l5 /dev/random)
/ dev / random unter OSX besteht nur aus zufälligen Bytes und
xxd -p -l5
konvertiert 5 der ASCII-Zeichen in hexadezimal und wandeltprintf
sie in ein Dezimalformat um.quelle
Pyth , 11 Bytes
Hinweis: Dieses Programm stürzt wahrscheinlich mit einem Speicherfehler auf einem realen Computer ab. Versuchen Sie zum Testen, durch
G
eine kürzere Zeichenfolge zu ersetzen , z. B. in diesem Code, der Zahlen mit einem Durchschnitt von etwa 28000 generiert:Dieser Code durchläuft eine Schleife und addiert eine Zufallszahl von -1 bis 8
Z
mit einer Wahrscheinlichkeit von 2 ^ -26, die Schleife bei jeder Wiederholung zu verlassen. Die 2 ^ -26 Wahrscheinlichkeit wird durch Auswahl eines zufälligen Elements (O
) der Menge aller Teilmengen (y
) des Alphabets (G
) erreicht.Technische Details & Begründung:
Die Wahrscheinlichkeit 2 ^ -26 ergibt sich aus zwei Tatsachen:
y
Wenn Sequenzen aufgerufen werden, ist dies die Potenzmengenfunktion, und es wird eine Liste aller Teilmengen der Eingabe erstellt. Da die EingabeG
26 Zeichen lang ist, hat diese PotenzmengeyG
2 ^ 26 Einträge.OyG
wählt ein zufälliges Element aus diesen 2 ^ 26 Einträgen aus. Genau einer dieser Einträge, die leere Zeichenfolge, wird bei der Übergabe an als falsch bewertetW
die while-Schleife . Daher besteht jedes Mal eine Wahrscheinlichkeit von 2 ^ -26, die Schleife zu verlassen.In jeder festen Anzahl von Schleifenzyklen K ist die Wahrscheinlichkeit, die Zahl K * 3,5 + m und K * 3,5 - m zu erhalten, gleich, weil jede Folge von Addenden, die eine Gesamtsumme erreicht, invertiert werden kann, -1 -> 8, 0 -> 7 usw., um den anderen zu erreichen. Zahlen, die näher an K * 3.5 liegen, sind deutlich wahrscheinlicher als weiter entfernte Zahlen. Wenn also K> 2000000 / 3.5 = 571428.5 ist, ist die Wahrscheinlichkeit, eine Zahl über 1000000 zu erhalten, größer als 75%, da einige der Ergebnisse über dieser Zahl in eine Eins-zu-Eins-Entsprechung mit allen Ergebnissen darunter gesetzt werden können Zahl und die obere Hälfte können in eine Eins-zu-Eins-Entsprechung mit denen unter 1000000 gestellt werden. Die Wahrscheinlichkeit, mindestens 571429 Schleifen zu erhalten, beträgt (1-2 ^ -26) ^ 571429, was nein ist weniger als (1-2 ^ -26 * 571429), Die erwartete Häufigkeit, mit der die Schleife während der ersten 571429 Versuche verlassen wird, ist 99,1%. Somit besteht bei 99,1% oder mehr der Versuche eine 75% ige oder größere Chance, mindestens 1000000 zu erhalten, und somit eine mehr als 50% ige Chance, über 1000000 zu gelangen.
Dieser Code basiert auf einem Verhalten, bei
O
dem ein Fehler vor 3 Tagen versehentlich aufgetreten ist und das heute behoben wurde. Es sollte auf jeder Version von Pyth 3 vor dem 22. Dezember oder nach dem heutigen Tag funktionieren. Der folgende Code ist äquivalent und hat immer funktioniert:quelle
Java, 113 Bytes
Dieses Programm druckt eine Binärzahl in den Standardausgabestream. Möglicherweise müssen Sie eine Weile warten, da die Wahrscheinlichkeit, dass die Zahl endet (oder positiv ist), ungefähr 0 beträgt. Die Vorstellung, dass der absolute Wert einer generierten Zahl weniger als 1 Million beträgt, ist amüsant, aber möglich.
Ungolfed:
Beispielausgabe: Wird veröffentlicht, wenn eine Nummer generiert wurde.
quelle
Java (JDK) ,
140127 Byte-13 bytes
indem Sie mehr Logik in den Loop-Header einbinden - dank @ceilingcatProbieren Sie es online!
quelle