Je voudrais générer un ou quelques nombres aléatoires séparés par une nouvelle ligne.
Comment cela peut-il se faire?
text-generation
kenorb
la source
la source
:python
?Réponses:
Il n'y a pas de fonction intégrée pour cela, vous devrez donc utiliser quelque chose d'extérieur.
Shell UNIX (
/bin/sh
)Appel:
avec
system()
est un bon moyen. Vous ne pouvez obtenir que des chiffres en les remplaçanttr
pargrep
:Vous pouvez utiliser ceci dans Vim comme ceci:
Le nombre 15 est le nombre de nombres que vous souhaitez (ajustez en conséquence). Cela devrait fonctionner sur Linux, BSD, OSX et d'autres systèmes UNIX. Cela ne fonctionnera pas sur MS Windows.
Voir également mon article de blog " Générer des mots de passe à partir de la ligne de commande " (il existe de nombreuses mauvaises solutions pour cela).
Rubis
Ruby est probablement le deuxième meilleur choix, car les scripts Ruby semblent être un peu plus courants que les scripts Python. Obtenir un nombre aléatoire est facile:
Ou pour obtenir 15 numéros:
Python
Vous pouvez utiliser le module aléatoire ; pour obtenir un numéro unique:
Ou 15 numéros:
Cela devrait fonctionner pour Python 2 et 3.
Windows PowerShell
Vous pouvez utiliser
Get-Random
pour obtenir un nombre aléatoire:les fenêtres
cmd.exe
Windows 7 et versions ultérieures devraient être livrés avec PowerShell, mais si vous souhaitez une compatibilité maximale, vous pouvez utiliser
cmd.exe
. Il a une variable spéciale%RANDOM%
:Remarque: ce n'est pas très aléatoire! , il utilise le temps (!)
Notez que vous n'avez pas besoin d'utiliser les liaisons Ruby ou Python pour utiliser les solutions Ruby ou Python; vous pouvez également créer un script séparé et les appeler avec
system("python -c '...'")
(cela nécessite évidemment l'installation de ruby / python.la source
tr -d '[:space:]'
, peut-êtretr -cd '[:digit:]'
pour le filtre grep?:r! hexdump -n $((3*4)) -e '"%d"' /dev/urandom
-à- dire générer 3 entiers signés aléatoires.:r! hexdump -n $((3*4)) -e '"\%d\n"' /dev/urandom
Voici une solution Vimscript pure . Je ne l'ai pas créé, il a été développé par Charles E. Campbell. Vous pouvez trouver un dépôt Github avec son code ici .
L'algorithme utilise 3 graines générées au démarrage de Vim et génère un nombre pseudo-aléatoire basé sur des calculs et permutations appliqués aux graines:
La portée des variables est déclarée globale car elle est utilisée par la fonction générateur mais elle peut être limitée au script (
s:
)Et voici la fonction générateur:
Le dépôt comprend les fonctions suivantes:
Voici un test rapide que j'ai écrit pour tester le générateur: j'ai généré 1000000 nombres entre 0 et 9 et compté le nombre d'occurrences de chaque nombre voici les résultats:
Comme vous pouvez le voir, la génération semble bien répartie. Je suis conscient que ce n'est largement pas suffisant pour tester un générateur aléatoire, je vais donc essayer de faire une analyse supplémentaire si j'ai du temps libre.
la source
Il s'agit d'une méthode trouvée dans le plugin vim-randomtag , qui est basée sur la lecture ... microsecondes de l'heure actuelle, utilisable lorsque vous voulez juste un certain nombre, vous ne vous souciez pas beaucoup de la qualité de l'aléatoire, ou avez des problèmes de sécurité, etc.:
la source
Vim n'offre pas de générateur aléatoire natif, cependant si vous avez compilé vim avec Python, la méthode suivante ajoutera un chiffre aléatoire à la fin de votre ligne:
Remarque: Pour vérifier si votre vim prend en charge Python, essayez:
:echo has('python')
(1 pour oui).Vous pouvez également utiliser un shell qui offre une
$RANDOM
variable (fonctionne avec bash / ksh / zsh) qui renvoie un pseudo-aléatoire (0-32767), par exemple:ou:
ou:
Sous Windows, vous devez avoir installé Cygwin / MSYS / SUA ou utiliser une
%RANDOM%
variable comme le suggère Carpetsmoker .Si vous n'avez pas accès au shell et à Python, comme pour la solution de contournement, vous utilisez les derniers chiffres de l'horodatage actuel, par exemple:
Remarque: Si vous l'utilisez assez souvent, écrivez une fonction simple qui le fera
return reltimestr(reltime())[-4:]
.Pour ajouter d'autres nombres aléatoires, appuyez sur @:pour répéter la commande à nouveau. Ou préfixez avec un nombre (comme 10@:) pour ajouter beaucoup plus de nombres aléatoires séparés par de nouvelles lignes.
En relation:
la source
zsh
, mais pas avecsh
,dash
,fish
,csh
outcsh
... vous pouvez utiliser:r! bash -c 'echo $RANDOM'
...GetRandom()
fonction là où un bon prng est important, il est donc préférable de le faire dès le début si possible (et c'est presque toujours possible ici!)$RANDOM
, mais si c'est un mauvais PRNG alors ce n'est pas une raison pour utiliser un PRNG encore plus pauvre :-) Au lieu de cela, passez à un meilleur PRNG! Pour autant que je sache,/dev/urandom
est disponible sur toutes les plates-formes où ilbash
est couramment disponible, donc je ne vois pas de raison de ne pas l' utiliser.$RANDOM
. Cela semble être un très bon petit outil, et même s'il peut s'agir d'un "pauvre homme RNG" (comme le souligne @Carpetsmoker), il correspond certainement à l'exigence de "facilement mémorisable" de @ kenorb (qui a posé la question).Vous pouvez utiliser les fonctions
rand()
etsrand()
, à condition que votre binaire Vim inclue le patch 8.1.2342 .Par exemple, pour générer 10 nombres aléatoires séparés par des retours à la ligne:
Pour générer 10 nombres aléatoires tous inférieurs à 100:
Pour générer 10 chaînes alphabétiques aléatoires de 5 caractères:
Pour générer 10 mots aléatoires (extraits du fichier dictionnaire
/usr/share/dict/words
):Pour générer 10 séquences de 5 mots aléatoires:
Pour générer un UUID aléatoire version 4:
Pour appliquer un jeu de couleurs aléatoire:
la source
Je ne pense pas qu'il existe une fonction native pour les nombres aléatoires dans Vimscript.
Une façon d'utiliser
:python
(utilisez-la dans une fonction, peut-être, avec 10000 et 60 remplacés par des paramètres):Voir ma réponse à Making a box in vim via python pour une introduction rapide sur les scripts Python dans Vim.
Puisqu'il
vim.current.buffer
s'agit d'une liste de chaînes, nous pouvons lui affecter une liste de chaînes comme nous le ferions en Python.random.sample
est juste la façon la plus simple à laquelle je peux penser pour obtenir une liste d'entiers aléatoires en Python.la source
random.sample
ne repousse que deux arguments sur Python 2,str
c'est la fonction intégrée pour convertir les choses en chaînes. Permettez-moi de rechercher les équivalents Py3 (str
serait le même, devra vérifierxrange
etrandom.sample
).xrange
n'est pas en Python3 car ellerange
est équivalente (ni ne construit réellement une liste, contrairementrange
à Py2).map
dans Py3 renvoie un itérable et non une liste, donc la dernière ligne utiliseraitlist(map(str, random.sample(range(10000), 60)))