Ich möchte eine oder mehrere durch eine neue Zeile getrennte Zufallszahlen erzeugen.
Wie kann das gemacht werden?
text-generation
Kenorb
quelle
quelle
:python
?Antworten:
Dafür gibt es keine eingebaute Einrichtung, Sie müssen also etwas Externes verwenden.
UNIX-Shell (
/bin/sh
)Berufung:
mit
system()
ist ein guter weg. Sie können nur Zahlen erhalten, indem Sie ersetzentr
durchgrep
:Sie können dies in Vim folgendermaßen verwenden:
Die Zahl 15 ist die Anzahl der gewünschten Zahlen (entsprechend anpassen). Dies sollte unter Linux, BSD, OSX und anderen UNIX-Systemen funktionieren. Es funktioniert nicht unter MS Windows.
Siehe auch meinen Weblog-Beitrag " Passwörter über die Kommandozeile generieren " (es gibt viele schlechte Lösungen dafür).
Rubin
Ruby ist wahrscheinlich die nächstbeste Wahl, da Ruby-Skripte etwas häufiger zu sein scheinen als Python-Skripte. Eine Zufallszahl zu bekommen ist einfach:
Oder um 15 Nummern zu bekommen:
Python
Sie können das Zufallsmodul verwenden . um eine einzelne Nummer zu bekommen:
Oder 15 Zahlen:
Dies sollte sowohl für Python 2 als auch für Python 3 funktionieren.
Windows PowerShell
Sie können verwenden
Get-Random
, um eine Zufallszahl zu erhalten:Windows
cmd.exe
Windows 7 und höher sollte mit PowerShell geliefert werden. Wenn Sie jedoch maximale Kompatibilität wünschen, können Sie dies verwenden
cmd.exe
. Es hat eine spezielle Variable%RANDOM%
:Hinweis: Dies ist nicht sehr zufällig! , es nutzt die Zeit (!)
Beachten Sie, dass Sie die Ruby- oder Python-Bindungen nicht verwenden müssen, um die Ruby- oder Python-Lösungen zu verwenden. Sie können auch ein separates Skript erstellen und es mit aufrufen
system("python -c '...'")
(dies setzt natürlich voraus, dass Ruby / Python installiert ist).quelle
tr -d '[:space:]'
vielleichttr -cd '[:digit:]'
für den grep filter?:r! hexdump -n $((3*4)) -e '"%d"' /dev/urandom
man würde 3 zufällige Ganzzahlen mit Vorzeichen erzeugen.:r! hexdump -n $((3*4)) -e '"\%d\n"' /dev/urandom
Hier ist eine reine Vimscript- Lösung. Ich habe es nicht erstellt, es wurde von Charles E. Campbell entwickelt. Ein Github-Repo mit seinem Code finden Sie hier .
Der Algorithmus verwendet 3 Seeds, die beim Start von Vim generiert werden, und generiert eine Pseudozufallszahl basierend auf Berechnungen und Permutationen, die auf die Seeds angewendet werden:
Der Gültigkeitsbereich der Variablen wird als global deklariert, da sie von der Generatorfunktion verwendet werden, aber möglicherweise auf script (
s:
) beschränkt sind.Und hier ist die Generatorfunktion:
Das Repo beinhaltet folgende Funktionen:
Hier ist ein kurzer Test, den ich geschrieben habe, um den Generator zu testen: Ich habe 1000000 Zahlen zwischen 0 und 9 generiert und die Anzahl der Vorkommen jeder Zahl gezählt. Hier sind die Ergebnisse:
Wie Sie sehen, scheint die Generation gut verteilt zu sein. Mir ist bewusst, dass dies zum Testen eines Zufallsgenerators im Großen und Ganzen nicht ausreicht. Daher werde ich versuchen, eine zusätzliche Analyse durchzuführen, wenn ich etwas Zeit habe.
quelle
Dies ist eine Methode, die im vim-randomtag- Plugin gefunden wird und auf dem Lesen von ... Mikrosekunden in der aktuellen Zeit basiert. Sie kann verwendet werden, wenn Sie nur eine bestimmte Zahl möchten, wenn Sie nicht viel Wert auf die Qualität der Zufälligkeit legen oder Sicherheitsbedenken haben.
quelle
Vim bietet keinen nativen Zufallsgenerator. Wenn Sie Vim jedoch mit Python kompiliert haben, hängt die folgende Methode eine zufällige Ziffer am Ende Ihrer Zeile an:
Hinweis: Um zu überprüfen, ob Ihr Vim Python unterstützt, versuchen Sie Folgendes:
:echo has('python')
(1 für yes).Sie können auch eine Shell verwenden, die eine
$RANDOM
Variable anbietet (funktioniert mit bash / ksh / zsh), die ein Pseudozufall (0-32767) zurückgibt. Beispiel:oder:
oder:
Unter Windows müssen Sie Cygwin / MSYS / SUA installiert haben oder eine
%RANDOM%
Variable verwenden, wie von Carpetsmoker vorgeschlagen.Wenn Sie keinen Zugriff auf Shell und Python haben, wie zur Umgehung, verwenden Sie die letzten Ziffern des aktuellen Zeitstempels. Beispiel:
Hinweis: Wenn Sie es ziemlich oft verwenden, schreiben Sie eine einfache Funktion, die dies ermöglicht
return reltimestr(reltime())[-4:]
.Um weitere Zufallszahlen hinzuzufügen, drücken Sie @:, um den Befehl erneut zu wiederholen. Oder ein Präfix mit einer Zahl (wie 10@:), um viel mehr durch neue Zeilen getrennte Zufallszahlen hinzuzufügen.
Verbunden:
quelle
zsh
, aber nicht mitsh
,dash
,fish
,csh
, odertcsh
... könnten Sie:r! bash -c 'echo $RANDOM'
...GetRandom()
Funktion nutzen wird, wenn es auf gutes PRNG ankommt. Daher ist es besser, es möglichst von Anfang an richtig zu machen (und das ist hier fast immer möglich!)$RANDOM
ist, aber wenn dies ein schlechtes PRNG ist, dann ist das kein Grund, ein noch schlechteres PRNG zu verwenden :-) Aktualisieren Sie stattdessen auf ein besseres PRNG! Soweit ich weiß,/dev/urandom
ist es auf allen Plattformen verfügbar, auf denenbash
es allgemein verfügbar ist. Daher sehe ich keinen Grund, es nicht zu verwenden.$RANDOM
. Scheint wie ein sehr nettes kleines Werkzeug, und obwohl es ein "RNG des armen Mannes" sein mag (wie @Carpetsmoker betont), passt es definitiv zu der Anforderung von @kenorb (der die Frage gestellt hat) "leicht zu merken".Ich glaube nicht, dass es in Vimscript eine native Funktion für Zufallszahlen gibt.
Eine Möglichkeit zur Verwendung
:python
(verwenden Sie sie in einer Funktion, bei der 10000 und 60 durch Parameter ersetzt werden):In meiner Antwort auf " Eine Box in Vim über Python erstellen" finden Sie eine kurze Einführung in die Python-Skripterstellung in Vim.
Da
vim.current.buffer
es sich um eine Liste von Zeichenfolgen handelt, können wir ihr wie in Python eine Liste von Zeichenfolgen zuweisen.random.sample
Dies ist der einfachste Weg, wie ich mir vorstellen kann, in Python eine Liste zufälliger Ganzzahlen zu erstellen.quelle
random.sample
benötigt in Python 2 nur zwei Argumente,str
ist die eingebaute Funktion, um Dinge in Strings umzuwandeln. Lassen Sie mich die Py3-Entsprechungen nachschlagen (str
wäre gleich, müsste prüfenxrange
undrandom.sample
).xrange
ist nicht in Python3, weil sierange
äquivalent ist (und im Gegensatzrange
zu Py2 keine Liste erstellt).map
in PY3 eine iterable zurückgibt und keine Liste, so dass die letzte Zeile verwenden würdelist(map(str, random.sample(range(10000), 60)))
Sie können die Funktionen
rand()
undsrand()
verwenden, sofern Ihre Vim-Binärdatei den Patch 8.1.2342 enthält .Um beispielsweise 10 durch Zeilenumbrüche getrennte Zufallszahlen zu generieren, gehen Sie wie folgt vor:
So generieren Sie 10 Zufallszahlen, die kleiner als 100 sind:
So generieren Sie 10 zufällige alphabetische Zeichenfolgen mit 5 Zeichen:
So generieren Sie 10 zufällige Wörter (aus der Wörterbuchdatei
/usr/share/dict/words
):So generieren Sie 10 Folgen von 5 zufälligen Wörtern:
So generieren Sie eine zufällige UUID Version 4:
So wenden Sie ein zufälliges Farbschema an:
quelle