Variable choisie au hasard parmi trois nombres (10, 100 et 1000)

19

Est-il possible d'avoir une variable qui choisit un nombre aléatoire parmi trois nombres prédéterminés?

Échantillon:

var= 10 or 100 or 1000
Espen Larsen
la source
1
Je ne programme pas sous UNIX, je ne peux donc pas écrire le code, mais voici une autre approche: val = left ("1000", length = Random 2 through 4). Pour avoir trois valeurs indépendantes, le code serait similaire.
Sensii Miller

Réponses:

31

Utilisez un tableau pour contenir les valeurs et choisissez parmi celles-ci à l'aide de la variable intégrée $RANDOM. Par exemple,

x[0]=10     # One decade
x[1]=100    # One century
x[2]=1000   # One millennium

for ((i=1; i < 20; ++i)); do echo -n " ${x[$RANDOM%3]}"; done; echo
1000 10 10 10 10 100 10 100 100 10 10 100 100 100 10 1000 1000 1000 10

La qualité de l'aléatoire ne sera pas la meilleure possible (lisez les octets /dev/urandompour cela), mais elle devrait être plus que suffisante pour un script.

Note 1: Comme les gens ont observé dans les commentaires, au lieu d'initialiser les éléments du tableau individuellement l' on peut bien sûr utiliser un tableau litéral: x=(10 100 1000).

Remarque 2: Au lieu de coder en dur le nombre d'éléments dans le tableau, un élément radom peut être extrait par ${x[$RANDOM%${#x[@]}]}.

AlexP
la source
5
+1 Bien que la réponse de zeppelin soit intelligente dans ce cas particulier, l'approche par tableau est beaucoup plus générale.
Kamil Maciorowski
4
On dirait que x=(10 100 1000)crée un tableau à partir d'un littéral dans bash, ce serait plus lisible et plus idiomatique
cat
1
@cat: les opinions sur la lisibilité varient. J'aime mettre des éléments individuels sur des lignes distinctes, généralement avec des commentaires de fin expliquant la valeur.
AlexP
@AlexP Oh, je suppose que je ne commenterais pas si je pensais que c'était exprès. bien que juste
chat
1
@AlexP x[0]=10 # This sets the first value of x to ten. Ten is the number of fingers that humans have (excepting birth defects or mutilation). It is also the sum of 9 and 1, or product of 5 and 2. Ten is not prime. A traditional Christmas gift is ten lords a-leaping.quelque chose comme ça?
Nick T
30

Si vous utilisez bash (ou zsh ou ksh93 ), vous pouvez simplement faire:

echo "$((10**($RANDOM%3+1)))"

ou

var=$((10**($RANDOM%3+1)))

l'assigner à var

Zeppelin
la source
:). Facile quand vous le voyez, mais je ne l'ai pas fait. Merci!!
Espen Larsen
20

Vous pouvez également utiliser l' shufutilitaire GNU coreutils :

a=$(shuf -n1 -e 10 100 1000)

RANDOMCependant, l' utilisation selon les autres réponses est presque certainement plus rapide.

Traumatisme numérique
la source
C'est la meilleure réponse.
Tulains Córdova
8
case $(( RANDOM % 3 )) in
    0)
        var=10
        ;;
    1)
        var=100
        ;;
    2)
        var=1000
        ;;
esac
DopeGhoti
la source
5

Voici une manière légèrement cryptique:

printf -v var '1%0*d' $(( RANDOM % 3 + 1 )) 0

Cela attribuera la valeur aléatoire à $varcomme requis. La printfchaîne de formatage est 1%0Nd- cela entraîne 0l'impression avec Ndes zéros de tête, où Nsera un entier aléatoire dans l'intervalle [1,3].

Traumatisme numérique
la source