Menghasilkan beberapa angka acak dalam suatu rentang

8

Saya ingin menghasilkan, katakanlah 10 angka acak antara 100 dan 200 (keduanya termasuk). Bagaimana saya membuatnya dengan rand?

ignacio caviedes
sumber
2
Apa maksudmu rand? The RANDOMvariabel? /dev/random? /dev/urandom?
muru
Tidak, maksud saya perintah rand yang Anda jalankan dari bash.
ignacio caviedes
1
Ini randatau ini rand?
muru

Jawaban:

7

Jika Anda berarti randdari para randpaket (sebagai lawan satu dari OpenSSL), tidak mendukung batas bawah, hanya bagian atas terikat. Apa yang dapat Anda lakukan adalah trik 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 adalah jumlah angka acak yang Anda butuhkan
  • -Makan menjadi batas atas dari randoutput angka , jadi ( maks - min = 100)
  • -e -d '\n'menyetel pembatas ke baris baru. Itu untuk kenyamanan pemrosesan oleh awk.

The awkkode kemudian mengambil setiap baris dan menambahkan 100 untuk itu.

muru
sumber
Bagus, Muru. Itu dia! Tks banyak.
ignacio caviedes
Decir cepat, fantástico, Muru. Terima kasih banyak.
ignacio caviedes
6

Menggunakan python:

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

Keluaran:

187
123
194
190
124
121
191
103
126
192

Di sini saya telah menggunakan randommodul pythonuntuk menghasilkan 10 ( range(10)) bilangan bulat acak antara 100 dan 200 (termasuk) ( random.randint(100, 200)).

heemayl
sumber
5

Inilah cara 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 

Anda juga dapat menggunakan /dev/urandom(diadaptasi dari sini ):

$ 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
sumber
@ignaciocaviedes sama-sama Namun, harap pertimbangkan untuk menerima salah satu dari jawaban ini (muru perhap yang menggunakan alat yang Anda inginkan) dan membatalkan sisanya daripada meninggalkan komentar terima kasih. Itulah cara terima kasih diungkapkan di sini. Y porque le escribiste dan Castellano al Muru? El tío es de India! : P
terdon
@terdon Saya tidak tahu apa yang baru saja Anda katakan. Oo
muru
4

Anda juga dapat menggunakan 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
mengintip
sumber
3

Dengan shufdari GNU coreutils:

$ shuf -i 100-200 -n 10
159
112
192
140
166
121
135
120
198
139
cuonglm
sumber
Saya pikir Anda adalah jawaban terbaik untuk pertanyaan saya, Cuonglm. Saya menghargainya; Terima kasih banyak.
ignacio caviedes
2

Anda bisa menggunakannya $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
sumber
Itu berhasil, Pabi. Tks banyak lagi.
ignacio caviedes
1

Versi bash

Tidak ada yang spektakuler - emulasi sederhana untuk loop dengan icounter dan while. Rentang diatur menggunakan if . . . else . . .fistruktur. Catatan: prompt saya adalah direktori yang berfungsi terlebih dahulu, kemudian area input, jadi jangan bingung dengan apa yang Anda lihat

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

Versi C

Ini adalah kode yang saya gunakan saat mengambil kelas C di universitas saya. Edit kecil yang saya tambahkan agar sesuai dengan pertanyaan ini adalah penggunaan argumen baris perintah (alih-alih nilai hardcoding ke sumber)

$ 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
sumber
Cukup mirip: askubuntu.com/a/621557/158442
muru
@muru Tidak melihat seseorang telah mengepos itu. Saya sedang dalam proses menambahkan versi C saya juga. Apakah itu baik-baik saja jika saya menyimpan versi bash selain C?
Sergiy Kolodyazhnyy
Baik oleh saya, bagaimanapun juga.
muru
Jika Anda akan menggunakan C, Anda harus benar-benar menggunakan C ++ dengan randomperpustakaan: stackoverflow.com/a/19728404/2072269 , stackoverflow.com/a/19666713/2072269
muru
@muru Saya tidak terbiasa dengan C ++, hanya dengan C dasar sejauh ini. Tapi terima kasih atas informasinya ^ _ ^
Sergiy Kolodyazhnyy