Génération de plusieurs nombres aléatoires dans une plage

8

Je veux générer, disons, 10 nombres aléatoires entre 100 et 200 (tous deux inclus). Comment puis-je le faire avec rand?

ignacio caviedes
la source
2
Qu'entendez-vous par rand? La RANDOMvariable? /dev/random? /dev/urandom?
muru
Non, je veux juste dire la commande rand que vous exécutez depuis bash.
ignacio caviedes
1
Ça randou ça rand?
muru

Réponses:

7

Si vous voulez dire le à randpartir du randpaquet (par opposition à celui de OpenSSL), il ne supporte pas une limite inférieure, seule une limite supérieure. Ce que vous pouvez faire est l'astuce shift-lower-bound-to-zero-then-add-lower-bound:

$ rand -N 10 -M 100 -e -d '\n' | awk '{$0 += 100}1'
170
180
192
168
169
170
117
180
167
142
  • -N est le nombre de nombres aléatoires dont vous avez besoin
  • -Mserait la limite supérieure des randsorties numériques , donc ( max - min = 100)
  • -e -d '\n'définit le délimiteur sur une nouvelle ligne. C'est pour la commodité du traitement par awk.

Le awkcode prend ensuite chaque ligne et y ajoute 100.

muru
la source
Génial, Muru. C'est ça! Merci beaucoup.
ignacio caviedes
Quise decir, fantástico, Muru. Merci beaucoup.
ignacio caviedes
6

En utilisant python:

#!/usr/bin/env python2
import random
for i in range(10):
    print random.randint(100, 200)

Production :

187
123
194
190
124
121
191
103
126
192

Ici, j'ai utilisé le randommodule de pythonpour générer 10 ( range(10)) entiers aléatoires entre 100 et 200 (inclus) ( random.randint(100, 200)).

heemayl
la source
5

Voici un moyen Perl:

$ perl -le 'print 100+int(rand(101)) for(1..10)'

129
197
127
167
116
134
143
134
122
117
Or, on the same line:

$ perl -e 'print 100+int(rand(101))." " for(1..10); print "\n"'
147 181 146 115 126 116 154 112 100 116 

Vous pouvez également utiliser /dev/urandom(adapté d' ici ):

$ for((i=0;i<=10;i++)); do 
    echo $(( 100+(`od -An -N2 -i /dev/urandom` )%(101))); 
done
101
156
102
190
152
130
178
165
186
173
143
terdon
la source
@ignaciocaviedes vous êtes les bienvenus. Cependant, veuillez envisager d' accepter l' une de ces réponses (les muru de Perhap qui utilisent l'outil que vous vouliez) et de voter pour le reste au lieu de laisser des commentaires de remerciement. C'est ainsi que les remerciements sont exprimés ici. Y porque le escribiste en Castellano al Muru? El tío es de India! : P
terdon
@terdon Je n'ai aucune idée de ce que tu viens de dire. Oo
muru
4

Vous pouvez également utiliser awk:

$ awk -v min=100 -v max=200 -v freq=10 'BEGIN{srand(); for(i=0;i<freq;i++)print int(min+rand()*(max-min+1))}'
132
131
148
100
104
125
103
197
184
165
fouiner
la source
3

Avec shufde GNU coreutils:

$ shuf -i 100-200 -n 10
159
112
192
140
166
121
135
120
198
139
cuonglm
la source
Je pense que la vôtre est la meilleure réponse à ma question, Cuonglm. Je vous en suis reconnaissant; Merci beaucoup.
ignacio caviedes
2

Vous pouvez utiliser $RANDOM.

number=0   #initialize the number
FLOOR=100
RANGE=200
while [ "$number" -le $FLOOR ]
do
  number=$RANDOM
  let "number %= $RANGE"  # Scales $number down within $RANGE.
done
echo "Random number between $FLOOR and $RANGE $number"
echo
Pabi
la source
Ça a bien marché, Pabi. Tks encore beaucoup.
ignacio caviedes
1

Version bash

Rien de spectaculaire - émulation simple de boucle for avec icompteur et while. La plage est définie à l'aide de la if . . . else . . .fistructure. Note latérale: mon invite fonctionne d'abord dans le répertoire, puis dans la zone de saisie, alors ne vous trompez pas sur ce que vous voyez

$ ./bashRadom.sh 100 200                                                       
190
111
101
158
171
197
199
147
142
125

bashRadom.sh:

#! /bin/bash

i=0; 
while [ $i -lt 10  ]; do 

  NUM=$RANDOM; 
  if [ $NUM -gt $1 ] && [ $NUM -lt $2  ]; then 
      echo $NUM; 
  else continue; 
  fi;
  i=$((i+1));

done

Version C

C'est le code que j'ai utilisé pendant mes cours de C à mon université. La petite modification que j'ai ajoutée pour répondre à cette question consiste à utiliser des arguments de ligne de commande (au lieu de coder en dur les valeurs dans la source)

$ gcc randfunc.c   
$ ./a.out 100 200
100 
106 
155 
132 
161 
130 
110 
195 
105 
162 
187 

randfunc.c:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int randInt (int, int);

void
main (int argc, char *argv[])
{    
  int min = atoi (argv[1]), max = atoi (argv[2]), i = 0;
  srand (time (NULL));    

  for (i; i < 11; i++)
    {
      printf ("%d \n", randInt (min, max));
    }    
}    

int
randInt (int a, int b)
{
  int randValue;
  randValue = a + (int) rand () % (b - a + 1);
  return randValue;    
}
Sergiy Kolodyazhnyy
la source
Assez similaire: askubuntu.com/a/621557/158442
muru
@muru Vous n'avez pas vu quelqu'un qui a déjà posté cela. Je suis également en train d'ajouter ma version C. Serait-ce bien si je garde la version bash en plus de C?
Sergiy Kolodyazhnyy
Bien par moi, de toute façon.
muru
Si vous allez utiliser C, vous devez vraiment utiliser C ++ avec la randombibliothèque: stackoverflow.com/a/19728404/2072269 , stackoverflow.com/a/19666713/2072269
muru
@muru Je ne connais pas le C ++, seulement le C de base jusqu'à présent. Mais merci pour l'info ^ _ ^
Sergiy Kolodyazhnyy