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 Je veux randomiser l'heure d'un travail de crontab. P> $ aléatoire code> variable et d'autres produits [Cksum, OD (OD -VAN -N4 -TU4 -TU4 Dev / urandom)]. P>
6 Réponses :
Que diriez-vous d'utiliser les nanosecondes de l'heure système? Ce n'est pas comme si vous avez besoin de numéros cryptographiquement utiles ici. p> en fonction de la version de $ (( S'il ne prend pas en charge la syntaxe sans savoir quel système d'exploitation , version de / bin / sh code> c'est, vous pourrez peut-être faire: p>
date +% n code>% 60)) p>
$ (((()) ((code>), mais que vous avez dc, vous pouvez essayer: p>
/ bin / sh code> ou quoi
Des outils sont disponibles, il est difficile de trouver une solution garantie pour fonctionner. p> p>
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
Avez-vous awk? Vous pouvez appeler la fonction RAND () d'AWK. Par exemple:
@Adrian: Vous devez semer le générateur de nombres aléatoires: awk 'commencer {srand (); printf ("% d \ n", rand () * 60)} ' code>. Aucun redirection n'est nécessaire s'il n'y a qu'une clause code> code>.
@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 ()}' code> 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 () code> et même si je supprimais le code> couture code>, 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.
Si vous avez TR, TÊTE et / DEV / URANDOM, vous pouvez écrire ceci:
tr -cd 0-9 </dev/urandom | head -c 3
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 code>
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)
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.
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: spécialement au cas où vous voulez le traiter tout autre, par exemple pour établir une plage: p>
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))