Generieren mehrerer Zufallszahlen innerhalb eines Bereichs

8

Ich möchte beispielsweise 10 Zufallszahlen zwischen 100 und 200 (beide enthalten) generieren. Wie mache ich es mit Rand?

Ignacio Caviedes
quelle
2
Was meinst du damit rand? Die RANDOMVariable? /dev/random? /dev/urandom?
Muru
Nein, ich meine nur den Rand-Befehl, den Sie von Bash ausführen.
Ignacio Caviedes
1
Dies randoder das rand?
Muru

Antworten:

7

Wenn Sie das randaus dem randPaket meinen (im Gegensatz zu dem aus OpenSSL), unterstützt es keine Untergrenze, sondern nur eine Obergrenze. Was Sie tun können, ist der Trick, die untere Grenze auf Null zu verschieben und dann die untere Grenze hinzuzufügen:

$ rand -N 10 -M 100 -e -d '\n' | awk '{$0 += 100}1'
170
180
192
168
169
170
117
180
167
142
  • -N ist die Anzahl der Zufallszahlen, die Sie benötigen
  • -Mwäre die Obergrenze der randZahlenausgänge, also ( max - min = 100)
  • -e -d '\n'Setzt das Trennzeichen auf eine neue Zeile. Dies dient der bequemen Verarbeitung durch awk.

Der awkCode nimmt dann jede Zeile und fügt 100 hinzu.

muru
quelle
Großartig, Muru. Das ist es! Danke vielmals.
Ignacio Caviedes
Quise Decir, Fantástico, Muru. Vielen Dank.
Ignacio Caviedes
6

Verwenden von python:

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

Ausgabe :

187
123
194
190
124
121
191
103
126
192

Hier habe ich das randomModul von verwendet python, um 10 ( range(10)) zufällige Ganzzahlen zwischen 100 und 200 (enthalten) ( random.randint(100, 200)) zu generieren .

heemayl
quelle
5

Hier ist ein Perl-Weg:

$ 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 

Sie könnten auch verwenden /dev/urandom(angepasst von hier ):

$ 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
quelle
@ignaciocaviedes Gern geschehen. Bitte akzeptieren Sie jedoch eine dieser Antworten (perhap's muru's, die das gewünschte Tool verwendet) und stimmen Sie den Rest ab, anstatt Dankeskommentare zu hinterlassen. So wird hier gedankt. Y porque le escribiste en Castellano al Muru? El tío es de India! : P
terdon
@terdon Ich habe keine Ahnung, was du gerade gesagt hast. Oo
Muru
4

Sie können auch verwenden 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
schnüffeln
quelle
3

Mit shufvon GNU Coreutils:

$ shuf -i 100-200 -n 10
159
112
192
140
166
121
135
120
198
139
cuonglm
quelle
Ich denke, deine ist die beste Antwort auf meine Frage, Cuonglm. Ich schätze es; vielen Dank.
Ignacio Caviedes
2

Sie können verwenden $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
quelle
Es hat gut funktioniert, Pabi. Tks wieder viel.
Ignacio Caviedes
1

Bash-Version

Nichts Spektakuläres - einfache Emulation von for loop mit iZähler und while. Der Bereich wird mithilfe der if . . . else . . .fiStruktur festgelegt. Randnotiz: Meine Eingabeaufforderung ist zuerst das Arbeitsverzeichnis und dann der Eingabebereich. Lassen Sie sich also nicht verwirren, was Sie sehen

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

Dies ist der Code, den ich während des C-Unterrichts an meiner Universität verwendet habe. Eine kleine Bearbeitung, die ich hinzugefügt habe, um diese Frage zu beantworten, ist die Verwendung von Befehlszeilenargumenten (anstelle von Hardcodierungswerten in der Quelle).

$ 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;    
}
Sergiy Kolodyazhnyy
quelle
Ganz ähnlich: askubuntu.com/a/621557/158442
muru
@muru Ich habe noch niemanden gesehen, der das gepostet hat. Ich bin gerade dabei, meine C-Version hinzuzufügen. Wäre es in Ordnung, wenn ich zusätzlich zu C die Bash-Version behalten würde?
Sergiy Kolodyazhnyy
Gut von mir, so oder so.
Muru
Wenn Sie C verwenden möchten , sollten Sie C ++ wirklich mit der randomBibliothek verwenden: stackoverflow.com/a/19728404/2072269 , stackoverflow.com/a/19666713/2072269
muru
@muru Ich bin nicht mit C ++ vertraut, nur mit Basic C bisher. Aber danke für die Info ^ _ ^
Sergiy Kolodyazhnyy