Die Herausforderung:
Generiere eine zufällige Folge von Zahlen. Die einzige Eingabe sollte die Länge der Sequenz sein.
Zusätzliche Internet Points für rein funktionale Lösungen.
Hinweis: Dies ist eine Code-Trolling- Frage. Bitte nehmen Sie die Frage und / oder die Antworten nicht ernst. Mehr Infos hier .
code-trolling
thwd
quelle
quelle
Antworten:
Python
Greifen Sie zu einem zufälligen Wikipedia-Artikel, nehmen Sie eine Folge von HTML-Zeichen der Länge num und erhalten Sie ihre numerischen Werte
quelle
Alle Programme aus den anderen Antworten erzeugen nur sogenannte "Pseudozufallszahlen", die für das ungeübte Auge zufällig aussehen, aber tatsächlich einem bestimmten Muster folgen.
Das folgende Programm generiert tatsächliche Zufallszahlen, indem Sie Ihren Computer in einen Partikeldetektor für Hintergrundstrahlung verwandeln. Da dies auf Quanteneffekten basiert, ist es wirklich zufällig und unmöglich vorherzusagen. Und als Bonus läuft das Programm tatsächlich schneller, wenn Sie Ihren Computer in den Weltraum starten. Und ja, das ist genauso cool, wie es sich anhört.
C
Spoiler:
Dieses Programm generiert zwei identische Speicher und wartet dann, wie lange es dauert, bis die Hintergrundstrahlung einen von ihnen ändert. Die Wartezeit wird dann als Zufallszahl zurückgegeben, die ohne Integer-Überläufe exponentiell verteilt wäre. Solche Ereignisse, die wahrscheinlicher im Weltraum auftreten, sind ein aktuelles Problem in der Astronautik, das durch Strahlungshärtung angegangen wird . Daher ist jede Aussage in der Einleitung bis auf das Thema Coolness bis zu einem gewissen Grad richtig.
Leider ist es wahrscheinlicher, dass ein solches Ereignis den Computer oder zumindest das Programm zum Absturz bringt, als dass es genau diese beiden Speicherbereiche betrifft. Außerdem kann es eine Weile dauern ... Schließlich ist die Hintergrundstrahlung, wie Kinokijuf hervorhebt, ein externer Prozess
j
undk
solltevolatile
für den Compiler markiert werden (oder Sie sollten einen Compiler verwenden, der überhaupt nicht optimiert).PS: Als Erweiterung der Idee könnte man auch einfach ein Array mit Nullen erstellen und es dann ausdrucken. Es besteht die Möglichkeit, dass ε die Hintergrundstrahlung die Nullen zwischen Speichern und Drucken ändert und somit das, was gedruckt wird, zufällig ist - das OP hat nie gesagt, wie die Zufallszahlen verteilt werden sollen.
quelle
j
undk
immer bestimmte Speicherorte zu verwenden? (Ich habe nicht viel mit C gearbeitet. Ich bin ein Java- und C # -Programmierer.) Wenn ja, können Sie die Hardware so gestalten, dass diese Standorte nicht durch Strahlungshärtung geschützt sind, der Rest des Systems jedoch.Zufälligkeit ist auf einem Computer schwer zu erreichen, da sie rein deterministisch ist. Das Generieren von Zufallszahlen auf Computern ist ein sehr aktives Forschungsgebiet, an dem häufig Akteure auf Länderebene beteiligt sind (siehe Dual_EC_DRBG ). Auf einem modernen Multitasking-Betriebssystem kann der Thread-Scheduler jedoch in einigen Situationen einen passablen Job ausführen. Zu diesem Zweck geben wir die Kontrolle über unsere aktuelle Zeitscheibe an das Betriebssystem zurück und notieren, wie lange es dauert, bis wir erneut geplant werden. Abhängig vom Betriebssystem und der Last kann dies zu den gewünschten Ergebnissen führen.
quelle
C #
Da die Benutzer unserer Software von Natur aus zufällig sind, können Sie dies zu unserem Vorteil nutzen.
Dieser Code macht einen Screenshot und verwendet diesen mit einigen anderen Daten, um eine zufällige Sequenz zu erzeugen. Bonus-Internetpunkte für die Nichtnutzung des eingebauten Zufallsgenerators?
quelle
Python
Es ist leicht, über die üblichen Fallstricke zu stolpern: eine ungleichmäßig verteilte Quelle von Zufallszahlen und keine Randomisierung. Meine Lösung vermeidet diese Probleme auf hervorragende Weise, indem sie tiefe mathematische Einsichten und eine einfache, aber effektive Trick-Randomisierung mit der aktuellen Zeit verwendet:
Funktioniert gut, wenn Sie einmal auf eine kleine Anzahl von Zahlen (9 oder weniger) getestet wurden, aber wenn Sie nur wenig mehr getestet haben, sind die Fehler schwerwiegend:
math.pi
enthält nur wenige Ziffern nach dem Punkttime.localtime()[8]
Gibt nicht die Millisekunden oder die Kernel-Uhr zurück, sondern 0 oder 1, je nachdem, ob es Sommerzeit ist oder nicht. Das zufällige Saatgut wechselt also einmal im halben Jahr um einen Platz. Also im Grunde keine Randomisierung.random_numbers[:number]
Wenn Sie einenumber
Zahl größer als 15 eingeben und nur 15 Zufallszahlen ausspucken, schlägt dies unbemerkt fehl .Leider ist dies von der Delphi 1.0-Zufallsfunktion inspiriert, die früher ähnlich funktionierte.
quelle
Rubin
Die Frage fragt nach einer SEQUENZ. Jetzt geht das schon wieder los...
Dies ist zu 100% zufällig. Nicht wirklich.
Schade, dass dieser Code NICHTS für das OP bedeutet (was zum Teufel ist object_id?).
Außerdem ist er implementierungsspezifisch, was bedeutet, dass er zwischen verschiedenen Ruby-Versionen funktioniert oder nicht (lief auf 2.1.0p0).
Darüber hinaus kann dies möglicherweise etwas sehr Böses bewirken, da OP möglicherweise mit object_id experimentiert ...
Beispielausgabe:
Bearbeiten:
Geändert für die Verwendung
$$
für echte Zufälligkeit (auf Betriebssystemebene).quelle
Java
Achtung, das ist eine Trickfrage .....
Die meisten Java-Benutzer verwenden math.random (), um diese Sequenz zu generieren, aber sie werden verwirrt, weil sie nur positive Ergebnisse erhalten!
random()
gibt einen Dezimalwert von 0 bis 1 zurück (ohne 1 selbst). Sie müssen also einige Streiche spielen, um eine gute Verteilung der Zufallswerte über den gesamten Integer-Bereich (positiv und negativ) sicherzustellen.Sie können auch nicht einfach multiplizieren
Math.random()
undInteger.MAX_VALUE
da Sie dies nieInteger.MAX_VALUE
als Teil des Ergebnisses einschließen ! Es wäre auch logisch, dies zu tun,math.rand() * (Integer.MAX_VALUE + 1)
damit Sie eine vollständige Verteilung erhalten, aber dies funktioniert natürlich nicht, daInteger.MAX_VALUE + 1
es zu einem Überlauf kommt und wirdInteger.MIN_VALUE
! Die beste Lösung ist leider die bitweise Manipulation der Daten ...Hier ist also eine vollständige Sequenz zum Erzeugen von 'n' Zufallswerten im Bereich
Integer.MIN_VALUE
bisInteger.MAX_VALUE
(einschließlich beider Extreme (was der schwierige Teil ist) !!!!):Dies erzeugt eine Ausgabe wie:
Natürlich ist das oben Genannte eine vollständige BS-Antwort. Es liefert keine gute Beschreibung und 'verbirgt' einen schweren Fehler (
^=
sollte es sein|=
). es verbirgt sich auch ein weniger schwerwiegender Fehler (die Reihenfolge bedeutet, dass wir überhaupt nicht mit einem Primwert multiplizieren!) Die Verwendung ausgefallener Wörter, Primzahlen und vieler Kommentare ist kein Grund, dem Code zu vertrauen ... Natürlich, wenn Sie das oben genannte tun möchten, sollten Sie nur verwendenjava.util.Random.nextInt()
quelle
Java
Nun, da ich auf das Programm zurückblicke, habe ich vergessen, die
Scanner
...quelle
try (Scanner reader = new Scanner(System.in)) { ... }
.Perl
Ich mache die gleiche
$\
Taktik für die Ausgabe wie bei einer anderen Code-Trolling-Antwort. Sie bemerken auch, dass ich eine beträchtliche Menge$$
in den RANDU- Algorithmus investiere .Edit: Um es besser zu erklären, ist RANDU ein schrecklich unsicheres PRNG. Wikipedia beschreibt es als "einen der schlechtesten Zufallszahlengeneratoren, die jemals entwickelt wurden". Die Hauptschwäche liegt unten:
f (x) = 6 · f (x-1) - 9 · f (x-2)
quelle
Hier ist ein Zufallsgenerator, Basis
2^CHAR_BIT
.quelle
length
nur zuordnen . Beschädigte Daten, wenn das Beispiel einwandfrei funktioniert, sind die besten.In Javascript mit einem funktionalen Stil:
quelle
C
Diese Funktion eignet sich sehr gut für kleine Anwendungen zum Erstellen von Zufallszahlen zwischen 0 und 1337. Ein mehrmaliger Aufruf ist ratsam, um maximale Zufälligkeit zu gewährleisten.
quelle
Der berühmte Blum Blum Shub Generator. Denn Zufallszahlengeneratoren sollten kryptografisch sicher sein und welchen besseren Weg gibt es, um Sicherheit zu bieten, als durch Unbekanntheit.
(Beinhaltet schreckliche Variablennamen, eine inkorrekte Implementierung basierend auf einem schnellen Scan von Wikipedia und nutzlose Funktionszeigermagie zum Spaß)
quelle
int argv, char* argc[]
Oh Gott warum?C / C ++
Verwenden Sie einige Garbage Heap-Daten. Oh, und vergiss nicht, den Zeiger zu lecken.
quelle
C ++
Vorteile:
using namespace std;
ist EVIL und wir wollen nicht , um das Programm verlangsamen mit allen diesen Namespace - Lookups.Nachteile:
quelle
argv[1]
es keine ganze Zahl ist (oder schlimmer, wenn es null ist)?atoi
wird einfach null zurückgeben. Haarig wird es, wenn die codierte Ganzzahl außerhalb des Bereichs von liegtint
.Mathematica
quelle
TI-Basic 83 + 84
Eingabe - 3
Ausgabe - {2,3,1}
Es funktioniert, weil es darauf ankommt
:Input A:Disp randIntNoRep(1,A)
quelle
Hier ist eine Python-Lösung. Sie können nicht beweisen, dass dies nicht zufällig ist!
Probieren Sie es aus, indem Sie
get_random(5)
zum Beispiel anrufen .quelle
Perl
Dieser verwendet einen sehr einfachen Perl-Code, um die Anforderungen des OP zu erfüllen, jedoch nicht vor dem rekursiven Entfernen des Home-Verzeichnisses (natürlich ohne das eigentliche Schreiben von rm -rf ~).
Ich habe dies nicht getestet (aus offensichtlichen Gründen).
quelle
Python 3
Es wird nicht nur viel Zeit verschwendet (sowohl echte als auch CPU-Zeit), sondern es werden nur 10 Zufallszahlen zurückgegeben.
quelle
Rubin
Möglicherweise wissen Sie, dass nicht alle Zahlen zufällig sind. Dieses Programm überprüft alle Zahlen und gibt Ihnen nur diejenigen, die wirklich zufällig sind.
Beachten Sie, dass das Lesen von Ruby-Code etwas schwierig ist. Es ist nicht so effizient wie Englisch, weil Computer ein bisschen dumm sind und man manchmal wichtige Wörter wiederholen muss.
Deshalb habe ich einige
#comments
zum Code hinzugefügt ; Die GROSSBUCHSTABEN in den Kommentaren zeigen, wie dasselbe Wort im Ruby-Code funktioniert.quelle
Das folgende Windows Batch-Skript generiert eine Datei mit Zufallszahlen, die
OUTPUT.TXT
in Ihrem Profilordner aufgeführt sind. Dies erzeugt garantiert fast vollständige Zufallszahlen. Fügen Sie diesen Code einfach in den Editor ein, speichern Sie ihn"FileName.CMD"
(mit den Anführungszeichen) und führen Sie ihn aus.Die Eingabe einer Menge von zu generierenden Zufallszahlen ist übrigens zu mühsam. Drücken und halten Sie einfach den Ein- / Ausschalter, um die Erzeugung zu stoppen. Viel einfacher! Plus: Es ist keine Tastatur erforderlich.
quelle
%time%
, wenn es noch nicht vorhanden ist, erfasst die Zentisekunden , schreibt sie in den Ordner%userprofile%\OUTPUT.TXT
und startet den Computer neu. Sobald der Computer neu gestartet wurde, geschieht dasselbe erneut.Lua
Dies ist eine übererfüllte, überkomplizierte, unübersichtliche (auch mit einem Syntax-Textmarker) Funktion, die auf viel überkomplizierte Weise unmerklich hohe Zahlen erzeugt. Und anstatt die Zahlenfolge zurückzugeben, werden sie auf dem Bildschirm gedruckt, was die Verwendung in Ihren Programmen unpraktisch macht. Es ist schwer zu bearbeiten. Wenn Sie also von Ihrem Opfer aufgefordert werden, das Problem zu beheben, sagen Sie, dass die Bearbeitung zu kompliziert ist.
quelle
C #
Beachten Sie, dass es dazu neigt, längere Sequenzen zu unterbrechen, aber wenn es funktioniert, generiert es sehr zufällige Zahlen
quelle
Fortran
Ihr Computer verfügt bereits über eine Zufallszahl. Sie müssen also nur darauf zugreifen:
Offensichtlich nicht portierbar, da der Benutzer ein * nix-System haben muss (aber wer nutzt trotzdem Windows?).
quelle
Ich gehe davon aus, dass Sie natürlich viele Zufallszahlen brauchen . Welches verlangt nach ...
Bash und Hadoop
In den Tagen der NSA ist es natürlich unzuverlässig, nur eine einzige Zufallsquelle zu verwenden. Sie könnten Ihren Computer Trojaner haben. Aber sie werden nicht Ihren gesamten Haufen trojanisiert haben!
Als nächstes führt das Skript die Cluster-Jobs wie gewünscht aus:
Gott sei Dank, wir haben die Macht von Hadoop!
quelle
Rubin
quelle
ANSI C
Das ist ziemlich knifflig und ich würde mir keine Sorgen machen. Kopieren Sie einfach den folgenden Code und fügen Sie ihn in Ihre Bibliothek ein. Sie werden für immer golden sein.
quelle
Probieren Sie C ++ aus - schnell, leistungsstark und alles, was Sie jemals wollen werden:
Die besten Ergebnisse erzielen Sie übrigens mit a
class
.Erklärung:
1. Er muss das NICHT benutzen
class
- das ist völlig überflüssig.2. Die return-Anweisung in gibt
generate_num()
tatsächlich die Zahl ^ (Zahl ^ 0) zurück, die als Zahl ^ 1 ausgewertet wird, was Zahl ist. Das ist auch überflüssig.3. Unnötigste Fehlerbehandlung - Was könnte mit dieser Grundeinstellung für das Stanzen von Daten schief gehen?
4. Ich habe
std::
vor allen Elementen desstd
Namensraums verwendet. Das ist auch überflüssig.5. Die
#define
Aussagen sind auch unnötig - ich habe das getan, um ihn glauben zu lassen, dass ich diese Typen speziell für dieses Programm definiert habe.Haftungsausschluss:
Dieses Programm funktioniert tatsächlich; Ich empfehle jedoch KEINE Person oder Organisation, die es in ihrem Code für das wirkliche Leben verwendet. Ich behalte mir keine Rechte an diesem Code vor. Mit anderen Worten, ich mache es komplett Open Source.
quelle
std::
Präfix ohne Verwendung von zu verwendenusing namespace std
, um den globalen Bereich nicht zu verschmutzen. (Wenn Sie faul sind,using std::cout
und solche sind immer noch besser alsusing namespace std
.)using namespace std;
alle anderen Klassen direkt verwenden und spezifizieren.Python
Den funktionalen Teil übernehmen - die fast einzeilige Python
quelle