7
votes

Nombre aléatoire entre la plage de la coquille

Comment puis-je générer un nombre aléatoire entre 0 et 60 en SH (/ bin / sh, pas bash)? Ceci est une boîte satellite, il n'y a pas de $ aléatoire variable et d'autres produits [Cksum, OD (OD -VAN -N4 -TU4 -TU4

Je veux randomiser l'heure d'un travail de crontab.


0 commentaires

6 Réponses :


9
votes

Que diriez-vous d'utiliser les nanosecondes de l'heure système? XXX

Ce n'est pas comme si vous avez besoin de numéros cryptographiquement utiles ici.

en fonction de la version de / bin / sh c'est, vous pourrez peut-être faire:

$ (( date +% n % 60))

S'il ne prend pas en charge la syntaxe $ (((()) ), mais que vous avez dc, vous pouvez essayer: xxx

sans savoir quel système d'exploitation , version de / bin / sh ou quoi Des outils sont disponibles, il est difficile de trouver une solution garantie pour fonctionner.


1 commentaires

Malheureusement, pas travaillé avec la date, il n'y a pas de dc .. / bin / sh --Help / bin / sh --Help Busybox v1.15.3 (2010-07-21 18:00:33) Binarys multi-soins



2
votes

Avez-vous awk? Vous pouvez appeler la fonction RAND () d'AWK. Par exemple: xxx


3 commentaires

@Adrian: Vous devez semer le générateur de nombres aléatoires: awk 'commencer {srand (); printf ("% d \ n", rand () * 60)} '. Aucun redirection n'est nécessaire s'il n'y a qu'une clause .


@Dennis, c'est vrai si vous planifiez sur Call Rand () plus d'une fois par seconde. Sinon, Srand () devrait être automatiquement ensemencé à l'époque


awk 'commence {imprimé rand (), rand ()}'; Dormir 3; awk 'begin {impression rand (), rand ()}' me donne la même paire de valeurs deux fois pour GNU AWK et Busybox AWK (différentes valeurs pour les différentes versions). Si j'inclus srand () et même si je supprimais le couture , les valeurs varient. Il n'est pas inhabituel d'avoir à semer explicitement un générateur de nombres aléatoires. Une partie de la raison en est ainsi que vous pouvez obtenir une séquence prévisible pendant les tests.



11
votes

Si vous avez TR, TÊTE et / DEV / URANDOM, vous pouvez écrire ceci:

tr -cd 0-9 </dev/urandom | head -c 3


3 commentaires

Ah. J'avais lu la question dans une telle façon de faire croire que / dev / urandom n'était pas présent. C'est une excellente solution.


Je reçois tr: séquence d'octets illégaux


essayez avec lang = c avant la commande (source: Stackoverflow.com/Questions/11287564/... qui est pour SED mais j'espère que cela devrait fonctionner pour vous aussi)



0
votes
value=`od -An -N2 -tu2 /dev/urandom`
minutes=`expr $value % 60`The seed will be between 0 and 65535, which is not an even multiple of 60, so minutes 0-15 have a slightly greater chance ob being chosen, but the discrepancy is probably not important.If you want to achieve perfection, use "od -An -N1 -tu1" and loop until value is less than 240.Tested with busybox od.

0 commentaires

0
votes

Méfiez des erreurs lorsque le numéro généré commence par 0 et a d'autres chiffres supérieurs à 7, comme il est interprété comme octal, je proposerais: xxx

spécialement au cas où vous voulez le traiter tout autre, par exemple pour établir une plage: xxx


0 commentaires

2
votes

Je sais que ce message est vieux, mais les réponses suggérées ne génèrent pas de nombres aléatoires impartiaux uniformes. La réponse acceptée est essentiellement ceci:

#!/bin/bash
RNUM=$(od -An -N4 -tu2 /dev/urandom | awk '{print $1}')
MIN=$((2**32 % 60))
while [ $RNUM -lt $MIN ]; do RNUM=$(od -An -N1 -tu2 /dev/urandom); done
MINUTE=$(($RNUM % 60))


0 commentaires