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


8

Я хочу створити, скажімо, 10 випадкових чисел між 100 і 200 (обидва включені). Як зробити це з рандом?


2
Що ви маєте на увазі під rand? RANDOMЗмінної? /dev/random? /dev/urandom?
муру

Ні, я просто маю на увазі команду rand, яку ви виконуєте з bash.
ignacio caviedes

1
Це randчи це rand?
муру

Відповіді:


7

Якщо ви маєте на увазі пакет із пакета (на відміну randвід пакета OpenSSL), він не підтримує нижню межу, а лише верхню межу. Те, що ви можете зробити, це трюк "зрушення від нижньої межі до нуля", а потім "додавання" в нижній частині:rand

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


Чудово, Муру. Це воно! Ткс багато.
ignacio caviedes

Тихий децир, фантастико, Муру. Дуже дякую.
ignacio caviedes

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)).


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

@ignaciocaviedes ласкаво просимо. Однак, будь ласка, подумайте про прийняття одного з цих відповідей (муру perhap's, який використовує потрібний вам інструмент), і анонсуйте решту замість того, щоб залишати подячні коментарі. Саме тому тут висловлюються подяки. Y porque le escribiste en Castellano al Muru? El tío es de India! : П
тердон

@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

З shufосновними елементами GNU:

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

Я думаю, що ваша найкраща відповідь на моє запитання, Cuonglm. Я ціную це; дуже тобі дякую.
ignacio caviedes

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

Все добре, Пабі. Знову багато Tks.
ignacio caviedes

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 Версія

Це код, яким я користувався під час занять із класу 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;    
}


@muru Не бачив, щоб хтось це вже написав. Я також додаю свою версію С. Було б добре, якби я зберігав баш-версію на додаток до C?
Сергій Колодяжний

Мене штрафують у будь-якому випадку.
муру

Якщо ви збираєтеся використовувати C, ви дійсно повинні використовувати C ++ з randomбібліотекою: stackoverflow.com/a/19728404/2072269 , stackoverflow.com/a/19666713/2072269
Muru

@muru Я не знайомий з C ++, тільки з базовим C поки що. Але дякую за інформацію ^ _ ^
Сергій Колодяжний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.