287 votes

Nombre aléatoire d’une plage dans un Script Bash

J’ai besoin de générer un numéro de port aléatoire entre 2000-65000 depuis un script shell. Le problème est que $random est seulement un nombre de 16 bits, ainsi im coincé !

PORT = $(($RANDOM % 63000 +2001)) fonctionnerait très bien si ce n’était pas pour la limitation de la taille.

Quelqu'un at-il un exemple de comment je peux faire cela, peut-être par l’extraction de quelque chose de/dev/urandom et de le faire dans une fourchette ?

Merci.

541voto

dave Points 9000
<pre><code></code><p>Profitez !</p><p><em>Edit</em>: la plage est inclusive.</p></pre>

95voto

errno Points 241

Sur Mac OS X et FreeBSD, vous pouvez également utiliser jot :

60voto

Jesin Points 31

Selon la page de manuel de bash, $RANDOM est distribué entre 0 et 32767; c'est, c'est un unsigned 15 bits de la valeur. En supposant $RANDOM est distribuée de manière uniforme, vous pouvez créer un distribuée uniformément unsigned 30 bits entier comme suit:

$(((RANDOM<<15)|RANDOM))

Depuis votre gamme n'est pas une puissance de 2, un simple modulo opération n' près de vous donner une distribution uniforme, mais avec un 30 bits d'entrée de gamme et un moins-que-16-bits sortie de la gamme, que vous avez dans votre cas, cela devrait vraiment être assez proche:

PORT=$(( ((RANDOM<<15)|RANDOM) % 63001 + 2000 ))

48voto

ghostdog74 Points 86060

et voici un avec Python

et l’autre avec awk

19voto

Jefromi Points 127932

La plus simple manière générale qui vient à l'esprit est une interface one-liner:

perl -e 'print int(rand(65000-2000)) + 2000'

Vous pouvez toujours utiliser deux numéros:

PORT=$(($RANDOM + ($RANDOM % 2) * 32768))

Vous avez encore de clip de votre gamme. Ce n'est pas un général à n bits nombre aléatoire de la méthode, mais il va travailler pour votre cas, et c'est tout l'intérieur de bash.

Si vous voulez être vraiment mignon et lire à partir de /dev/urandom, vous pourriez faire ceci:

od -A n -N 2 -t u2 /dev/urandom

Que vais lire deux octets et de les imprimer comme un unsigned int; il vous reste à faire votre écrêtage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X