Version stochastique de seq pour générer une séquence de nombres / mots aléatoires?

10

Il y a quelque temps, j'ai utilisé un outil de type seq pour imprimer une séquence de nombres générés pseudo-aléatoires sur stdout. Vous pouvez spécifier une plage, une graine et le nombre d'échantillons et bien plus encore.

Je viens d'oublier le nom de cet outil. Quelqu'un peut m'aider?

Peut-être connaissez-vous même un outil plus avancé qui, par exemple, prend en charge différentes distributions de probabilité ou même la génération d'une séquence de mots aléatoires sous différents alphabets et distributions de longueur / caractère.

maxschlepzig
la source

Réponses:

11

Voulez-vous dire jot?

$ jot 
jot: jot - print sequential or random data
usage:  jot [ options ] [ reps [ begin [ end [ s ] ] ] ]
Options:
    -r      random data
    -c      character data
    -n      no final newline
    -b word     repeated word
    -w word     context word
    -s string   data separator
    -p precision    number of characters

Si vous utilisez Ubuntu, le paquet est athena-jot. Un exemple simple:

$ jot -r 10 12 27
26
13
22
18
25
12
13
23
15
23

Au revoir.

lcipriani
la source
oui, jot était cette commande, merci! Encore une fois, j'apprécie d'autres suggestions d'outils de génération de séquences plus avancés.
maxschlepzig
2

Si cela ne vous dérange pas d'écrire un petit script pour faire ce dont vous avez besoin, je vous recommande de le faire dans R , le système de statistiques open-source.

Par exemple, considérez ce one-liner pour obtenir une liste de 100 nombres distribués en gaussien:

$ Rscript -e 'write(rnorm(100) * 100 + 100, "", 1)'
234.2903
-25.53289
168.0262
-28.49810
105.0687
85.97355
269.5072
...

Décomposons cela.

La Rcommande standard vous amène dans un environnement de programmation interactif, ce qui est bien si vous essayez de savoir comment faire quelque chose à la main ou si vous construisez quelque chose de manière incrémentielle, mais d'après votre question, il semble que vous ayez juste besoin d'une liste de nombres pour envoyer à un autre programme. Donc, à la place, nous utilisons Rscript, qui se comporte plus comme un interpréteur de script Unix traditionnel: vous pouvez lui passer le nom d'un fichier contenant un script R, ou utiliser l' -eindicateur standard pour passer tout le texte du programme sur la ligne de commande.

rnorm()est la fonction R pour obtenir une liste de nombres aléatoires avec la distribution "normale" ou gaussienne. Il prend jusqu'à trois paramètres, seul le premier est requis, combien de nombres vous voulez. Nous avons demandé 100. En prenant les valeurs par défaut pour les deux autres paramètres facultatifs, nous obtenons une moyenne de 0 et un écart-type de 1.

L'arithmétique après cela montre juste une fonctionnalité intéressante du langage R: vous pouvez faire de l'arithmétique sur des tables de données entières, des matrices, etc., tout aussi facilement qu'une valeur scalaire dans un langage plus typique. J'ai multiplié toutes les valeurs générées par 100 et j'y ai ajouté 100, juste parce que je le peux. Parce que R est un langage de programmation à part entière, il n'y a aucune limite à ce que vous pourriez faire avec cette liste de nombres. C'est l'avantage d'utiliser un tel système au lieu d'une commande à usage fixe comme jot.

Nous transmettons le résultat de cette opération précédente à la write()fonction, qui écrit les données dans un fichier par défaut, mais nous l'avons remplacé en transmettant une chaîne vide pour le deuxième paramètre, le nom du fichier, de sorte qu'il écrit le tableau dans le terminal à la place. Le paramètre suivant,, 1indique simplement que nous voulons notre sortie au format à colonne unique.

R a de nombreuses autres fonctions de génération de nombres aléatoires intégrées au système de base. Par exemple, nous pouvons imiter la jotcommande dans la réponse de lcpriani avec ce script:

$ Rscript -e 'write(round(runif(10, 12, 27)), "", 1)'

Ici, nous utilisons runif()pour obtenir 10 nombres aléatoires uniformément distribués de 12 à 27. Comme rnorm(), que nous avons utilisé ci-dessus, cette fonction renvoie des valeurs à virgule flottante, nous devons donc les round()affecter à leurs valeurs entières les plus proches avant de les écrire à l'écran.

R dispose également d'un riche ensemble de modules complémentaires dans CRAN , un référentiel de packages modélisé sur le CPAN de Perl. Celui qui pourrait vous intéresser est simplement appelé random , qui sert d'interface à random.org , un service qui renvoie de vrais nombres aléatoires générés à partir du bruit atmosphérique.

R est un environnement de programmation complet, il se peut donc que vous n'ayez pas réellement besoin de sortir vos numéros de R au format texte. Vous pourrez peut-être résoudre votre problème entièrement dans R. Essayez-le.

Warren Young
la source
Quelle est la manière R d'obtenir x nombres aléatoires à partir d'un intervalle donné? Par exemple, 100 nombres aléatoires entre 10 et 200 (par exemple de la distribution normale)?
maxschlepzig
J'ai ajouté des informations sur l'imitation de la jotcommande de lcpriani à la réponse ci-dessus. Quant aux valeurs limites pour rnorm(), ce n'est pas ainsi que fonctionne la distribution normale. Si vous prenez la moyenne par défaut de 0 et SD de 1, alors 1000 est toujours une valeur de retour possible, c'est juste extrêmement improbable. R vous permettrait d'écrire quelque chose qui bloquerait les valeurs pour supprimer des choses en dehors d'une plage donnée, mais vous abuseriez probablement de la distribution normale.
Warren Young