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

8

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

игнасио кавидес
источник
2
Что вы имеете в виду rand? RANDOMПеременной? /dev/random? /dev/urandom?
Муру
Нет, я просто имею в виду команду rand, которую вы выполняете из bash.
игнасио кавидес
1
Это randили это rand?
Муру

Ответы:

7

Если вы имеете в виду 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выходных чисел , так ( max - min = 100)
  • -e -d '\n'устанавливает разделитель на новую строку. Это для удобства обработки awk.

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

Мур
источник
Отлично, Муру. Это оно! Ткс много.
игнасио кавидес
Quise Decir, fantástico, Muru. Большое спасибо.
игнасио кавидес
6

Использование 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)).

heemayl
источник
5

Вот способ 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
terdon
источник
@ignaciocaviedes пожалуйста. Однако, пожалуйста, подумайте о том, чтобы принять один из этих ответов (меру perhap, который использует инструмент, который вы хотели) и отказаться от остальных, вместо того, чтобы оставлять комментарии с благодарностью. Вот как здесь выражается благодарность. Ты понимаешь в Кастельяно-аль-Муру? Эль-Тис-эс-де-Индия! : P
terdon
@terdon Я понятия не имею, что ты только что сказал. Оо
Муру
4

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

С помощью shufGNU coreutils:

$ shuf -i 100-200 -n 10
159
112
192
140
166
121
135
120
198
139
cuonglm
источник
Я думаю, что ваш лучший ответ на мой вопрос, Cuonglm. Я ценю это; большое Вам спасибо.
игнасио кавидес
2

Вы можете использовать $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
источник
Всё сработало, Паби. Ткс много снова.
игнасио кавидес
1

Bash версия

Ничего впечатляющего - простая эмуляция петли со iсчетчиком while. Диапазон устанавливается с помощью 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

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

$ 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;    
}
Сергей Колодяжный
источник
Совершенно аналогично: askubuntu.com/a/621557/158442
Muru
@muru Не видел, чтобы кто-то уже опубликовал это. Я нахожусь в процессе добавления моей версии C также. Было бы хорошо, если бы я сохранил версию bash в дополнение к C?
Сергей Колодяжный
Хорошо, в любом случае.
Муру
Если вы собираетесь использовать C, вам действительно следует использовать C ++ с randomбиблиотекой: stackoverflow.com/a/19728404/2072269 , stackoverflow.com/a/19666713/2072269
Muru
@muru Я не знаком с C ++, пока только с базовым C. Но спасибо за информацию ^ _ ^
Сергей Колодяжный