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

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

8
задан 23 December 2015 в 09:42

7 ответов

С shuf от GNU coreutils:

$ shuf -i 100-200 -n 10
159
112
192
140
166
121
135
120
198
139
2
ответ дан 23 December 2015 в 19:42
  • 1
    Извините, я пропустил часть о Баннере на другом потоке. Вы корректны и ответили на мой вопрос. – Nokey 9 August 2016 в 17:59

Если Вы имеете в виду rand от rand пакет (в противоположность тому от OpenSSL), это не поддерживает нижнюю границу, только верхнюю границу. То, что можно сделать, является приемом 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 количество случайных чисел, в которых Вы нуждаетесь
  • -M была бы верхняя граница чисел rand выводы, таким образом (макс. - минута = 100)
  • -e -d '\n' устанавливает разделитель на новую строку. Это для удобства обработки awk.

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

7
ответ дан 23 December 2015 в 19:42
  • 1
    @ilkkachu я признаю ошибку, я перепроверил, и Вы корректны. Я думал, что это был продолжающийся снимок. отредактированный.. – heemayl 10 August 2016 в 02:35

Можно использовать $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
2
ответ дан 23 December 2015 в 19:42
  • 1
    Действительно ли причина cd /proc/self перенаправления к удару /proc/<BASH_PID> и ls -l /proc/self шоу /proc/<LS_PID> факт cd, действительно ли оболочка встроена, и ls двоичное приложение? – IanC 10 August 2016 в 07:04

Можно также использовать 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
ответ дан 23 December 2015 в 19:42
  • 1
    vivek@vivek:~$ df -Th Filesystem Type Size Used Avail Use% Mounted on udev devtmpfs 32G 0 32G 0% /dev tmpfs tmpfs 6.3G 18M 6.3G 1% /run /dev/sda5 ext4 430G 408G 0 100% / tmpfs tmpfs 32G 76M 32G 1% /dev/shm tmpfs tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs tmpfs 32G 0 32G 0% /sys/fs/cgroup /dev/sda3 vfat 96M 29M 68M 30% /boot/efi tmpfs tmpfs 6.3G 84K 6.3G 1% /run/user/1000 Как очистить sda5, поскольку он так или иначе занимает все место – kRazzy R 16 November 2017 в 08:30

Версия 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;    
}
1
ответ дан 23 December 2015 в 19:42

Используя 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)).

6
ответ дан 23 December 2015 в 19:42
  • 1
    clean средство, что раздел отмечен как хорошо, и фактический тест, пропускается. – Simon Richter 10 August 2016 в 04:32

Вот является 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
5
ответ дан 23 December 2015 в 19:42
  • 1
    clean означает, что раздел был размонтирован чисто и таким образом, никакая проверка не необходима (в противоположность you' сообщения воспроизведения журнала; d присматривают за сбоем питания или другим небезопасным завершением работы). – Mark 10 August 2016 в 08:04

Другие вопросы по тегам:

Похожие вопросы: