Создание нескольких случайных чисел в пределах диапазона

Я хочу генерировать, скажем, 10 случайных чисел от 100 до 200 (оба включены). Как мне сделать это с рандом?

Если вы имеете в виду rand из пакета rand (в отличие от OpenSSL), он не поддерживает нижнюю границу, а только верхнюю границу. Что вы можете сделать, так это трюк смены-ниже-на-ноль-затем-добавить-снизу:

 $ rand -N 10 -M 100 -e -d '\n' | awk '{$0 += 100}1' 170 180 192 168 169 170 117 180 167 142 
  • -N – количество случайных чисел, которые вам нужны
  • -M будет верхней границей чисел rand , поэтому ( maxmin = 100)
  • -e -d '\n' устанавливает разделитель в новую строку. Это для удобства обработки awk .

Затем awk код берет каждую строку и добавляет к ней 100.

Использование python :

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

Вывод :

 187 123 194 190 124 121 191 103 126 192 

Здесь я использовал random модуль python для генерации 10 ( range(10) ) случайных чисел от 100 до 200 (включая) ( random.randint(100, 200) ).

Вот путь 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 

Вы также можете использовать /dev/urandom (адаптированный отсюда ):

 $ 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 

Вы также можете использовать 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 

С shuf от GNU coreutils:

 $ shuf -i 100-200 -n 10 159 112 192 140 166 121 135 120 198 139 

Вы можете использовать $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 

Версия Bash

Ничего впечатляющего – простая эмуляция для цикла с i counter и while . Диапазон задается с использованием if . . . else . . .fi if . . . else . . .fi if . . . else . . .fi структура. Сторона примечания: мое приглашение – это рабочий каталог сначала, затем область ввода, поэтому не путайте с тем, что вы видите

 $ ./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 

Версия C

Это код, который я использовал, принимая класс C в своем университете. Небольшое редактирование, которое я добавил, чтобы соответствовать этому вопросу, – это использование аргументов командной строки (вместо значений жесткого кодирования в источнике)

 $ 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; }