Tạo một số số ngẫu nhiên trong một phạm vi


8

Tôi muốn tạo, giả sử 10 số ngẫu nhiên trong khoảng từ 100 đến 200 (bao gồm cả hai). Làm thế nào để tôi làm cho nó với rand?


2
Bạn có ý nghĩa randgì? Các RANDOMbiến? /dev/random? /dev/urandom?
muru

Không, tôi chỉ có nghĩa là lệnh rand mà bạn thực hiện từ bash.
ignacio caviedes

1
Cái này randhay cái này rand?
muru

Câu trả lời:


7

Nếu bạn có nghĩa là randtừ các randgói (như trái ngược với một từ OpenSSL), nó không hỗ trợ thấp hơn bị ràng buộc, chỉ một trên ràng buộc. Những gì bạn có thể làm là thủ thuật shift-low-ràng buộc-to-zero-then-add-low-ràng buộc:

$ rand -N 10 -M 100 -e -d '\n' | awk '{$0 += 100}1'
170
180
192
168
169
170
117
180
167
142
  • -N là số lượng ngẫu nhiên bạn cần
  • -Msẽ là giới hạn trên của các randđầu ra số , vì vậy ( max - min = 100)
  • -e -d '\n'đặt dấu phân cách thành một dòng mới. Đó là để thuận tiện cho việc xử lý bằng awk.

Các awkmã sau đó mất mỗi dòng và thêm 100 đến nó.


Tuyệt, Muru. Đó là nó! Tks rất nhiều.
ignacio caviedes

Quise decir, fantástico, Muru. Rất nhiều ân sủng.
ignacio caviedes

6

Sử dụng python:

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

Đầu ra:

187
123
194
190
124
121
191
103
126
192

Ở đây tôi đã sử dụng randommô-đun pythonđể tạo 10 ( range(10)) số nguyên ngẫu nhiên trong khoảng từ 100 đến 200 (bao gồm) ( random.randint(100, 200)).


5

Đây là một cách 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 

Bạn cũng có thể sử dụng /dev/urandom(điều chỉnh từ đây ):

$ 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 bạn được chào đón. Tuy nhiên, vui lòng xem xét chấp nhận một trong những câu trả lời này (perhap's muru sử dụng công cụ bạn muốn) và nâng cao phần còn lại thay vì để lại lời cảm ơn. Đó là cách cảm ơn được thể hiện ở đây. Y porque le escripiste en Castellano al Muru? El tío es de Ấn Độ! : P
terdon

@terdon Tôi không biết bạn vừa nói gì. Oo
muru

4

Bạn cũng có thể sử dụng 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

Với shuftừ lõi GNU:

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

Tôi nghĩ bạn là câu trả lời tốt nhất cho câu hỏi của tôi, Cườnglm. Tôi rât cảm kich; Cảm ơn rât nhiều.
ignacio caviedes

2

Bạn có thể sử dụng $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

Nó hoạt động tốt, Pabi. Tks rất nhiều một lần nữa.
ignacio caviedes

1

Phiên bản Bash

Không có gì ngoạn mục - mô phỏng đơn giản của vòng lặp với bộ iđếm và while. Phạm vi được thiết lập bằng cách sử dụng if . . . else . . .ficấu trúc. Lưu ý bên lề: lời nhắc của tôi là thư mục làm việc trước tiên, sau đó là khu vực nhập liệu, vì vậy đừng nhầm lẫn với những gì bạn thấy

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

Phiên bản C

Đây là mã tôi đã sử dụng khi học lớp C tại trường đại học của tôi. Chỉnh sửa nhỏ mà tôi đã thêm để phù hợp với câu hỏi này là sử dụng các đối số dòng lệnh (thay vì các giá trị mã hóa cứng vào nguồn)

$ 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;    
}

Khá giống nhau: Askubfox.com/a/621557/158442
muru

@muru Không thấy ai đó đã đăng cái đó. Tôi cũng đang trong quá trình thêm phiên bản C của mình. Sẽ ổn chứ nếu tôi giữ phiên bản bash ngoài C?
Sergiy Kolodyazhnyy

Tốt theo tôi, một trong hai cách.
muru

Nếu bạn sẽ sử dụng C, bạn thực sự nên sử dụng C ++ với randomthư viện: stackoverflow.com/a/19728404/2072269 , stackoverflow.com/a/19666713/2072269
muru

@muru Tôi chưa quen với C ++, chỉ với C cơ bản cho đến nay. Nhưng cảm ơn bạn đã biết thông tin ^ _ ^
Sergiy Kolodyazhnyy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.