Generowanie kilku liczb losowych w zakresie

8

Chcę wygenerować, powiedzmy, 10 liczb losowych od 100 do 200 (oba w zestawie). Jak zrobić to z randem?

    
zadawane ignacio caviedes 09.05.2015, 17:53
źródło

7 odpowiedzi

6

Jeśli masz na myśli rand z pakietu rand (w przeciwieństwie do OpenSSL), nie obsługuje dolnej granicy, tylko górną granicę. To, co możesz zrobić, to sztuczka z przesunięciem, zmniejszeniem, zejściem do zera, a następnie z dodaniem do dolnej granicy:

$ rand -N 10 -M 100 -e -d '\n' | awk '{$0 += 100}1'
170
180
192
168
169
170
117
180
167
142
  • -N to liczba liczb losowych, których potrzebujesz
  • -M będzie górną granicą numerów rand wyników, więc ( max - min = 100)
  • -e -d '\n' ustawia ogranicznik na znak nowej linii. To dla wygody przetwarzania przez awk .

Kod awk następnie pobiera każdą linię i dodaje 100 do niej.

    
odpowiedział muru 09.05.2015, 18:13
źródło
6

Używanie python :

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

Wynik:

187
123
194
190
124
121
191
103
126
192

Tutaj użyłem modułu random z python do wygenerowania 10 ( range(10) ) losowych liczb całkowitych od 100 do 200 (w zestawie) ( random.randint(100, 200) ).

    
odpowiedział heemayl 09.05.2015, 19:55
źródło
5

Oto sposób na Perla:

$ 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 

Można również użyć /dev/urandom (zaadaptowano z tutaj ):

$ 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
    
odpowiedział terdon 09.05.2015, 18:48
źródło
3

Możesz również użyć 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
    
odpowiedział snoop 23.12.2015, 06:42
źródło
2

Z shuf z GNU coreutils:

$ shuf -i 100-200 -n 10
159
112
192
140
166
121
135
120
198
139
    
odpowiedział cuonglm 10.05.2015, 10:47
źródło
2

Możesz użyć $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
    
odpowiedział Pabi 09.05.2015, 18:06
źródło
1

wersja Bash

Nic spektakularnego - prosta emulacja pętli for za pomocą i licznika i while . Zakres ustawia się za pomocą struktury if . . . else . . .fi . Uwaga boczna: mój monit to najpierw katalog roboczy, potem obszar wprowadzania danych, więc nie daj się pomylić z tym, co widzisz

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

Wersja C

To jest kod, którego używam podczas nauki w klasie C na mojej uczelni. Mała edycja, którą dodałem, aby pasować do tego pytania, to użycie argumentów linii poleceń (zamiast wartości kodowania w źródle)

$ 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;    
}
    
odpowiedział Sergiy Kolodyazhnyy 23.12.2015, 08:06
źródło

Przeczytaj inne pytania na temat tagów