Tạo mảng số nổi ngẫu nhiên giữa một phạm vi


89

Tôi không thể tìm thấy một hàm để tạo một mảng các số thực ngẫu nhiên có độ dài nhất định giữa một phạm vi nhất định.

Tôi đã xem xét Lấy mẫu ngẫu nhiên nhưng dường như không có chức năng nào làm những gì tôi cần.

random.uniform đến gần nhưng nó chỉ trả về một phần tử duy nhất, không phải là một số cụ thể.

Đây là những gì tôi đang theo đuổi:

ran_floats = some_function(low=0.5, high=13.3, size=50)

sẽ trả về một mảng gồm 50 số thực ngẫu nhiên không phải duy nhất (nghĩa là: được phép lặp lại) được phân phối đồng nhất trong phạm vi [0.5, 13.3].

Có một chức năng như vậy?


5
Bạn đã gắn thẻ câu hỏi numpy, nhưng bạn không đề cập đến numpy.random.uniform, mặc dù nó có chính xác chữ ký cuộc gọi mà bạn muốn. Bạn có numpysẵn thư viện không?
DSM

1
[random.uniform(low, high) for i in xrange(size)]
Phylogenesis

1
@DSM vâng tôi có và bạn rõ ràng là đúng 100%. Tôi đã bỏ lỡ chức năng đó và nó dường như làm chính xác những gì tôi cần. Bạn có thể trình bày nhận xét của mình như một câu trả lời không?
Gabriel

Câu trả lời:


137

np.random.uniform phù hợp với trường hợp sử dụng của bạn:

sampl = np.random.uniform(low=0.5, high=13.3, size=(50,))

Cập nhật tháng 10 năm 2019:

Mặc dù cú pháp vẫn được hỗ trợ, nhưng có vẻ như API đã thay đổi với NumPy 1.17 để hỗ trợ kiểm soát tốt hơn trình tạo số ngẫu nhiên. Về sau, API đã thay đổi và bạn nên xem tại https://docs.scipy.org/doc/numpy/reference/random/generated/numpy.random.Generator.uniform.html

Đề xuất nâng cao có tại đây: https://numpy.org/neps/nep-0019-rng-policy.html


23
Câu hỏi tìm kiếm trực quan của OP là some_function(low=0.5, high=13.3, size=50). Đó là giếng cách libs python được thiết kế #wow
Saravanabalagi Ramachandran

Kích thước không hoàn toàn rõ ràng và liên kết không hoạt động. Đây là một sự làm rõ nhỏ. kích thước: int hoặc nhiều int, tùy chọn. Hình dạng đầu ra. Ví dụ, nếu hình dạng đã cho là (m, n, k), thì m * n * k mẫu được vẽ. Nếu kích thước là Không có mặc định), một giá trị duy nhất được trả về nếu giá trị thấp và cao đều là đại lượng vô hướng.
vlad

@vlad - cảm ơn bạn đã chỉ ra vấn đề với liên kết. Tôi đã cập nhật câu trả lời để hy vọng bao gồm việc sử dụng hiện tại.
JoshAdel

20

Tại sao không sử dụng một danh sách dễ hiểu?

Trong Python 2

ran_floats = [random.uniform(low,high) for _ in xrange(size)]

Trong Python 3, rangehoạt động như xrange( ref )

ran_floats = [random.uniform(low,high) for _ in range(size)]

3

Tại sao không kết hợp random.uniform với một danh sách dễ hiểu?

>>> def random_floats(low, high, size):
...    return [random.uniform(low, high) for _ in xrange(size)]
... 
>>> random_floats(0.5, 2.8, 5)
[2.366910411506704, 1.878800401620107, 1.0145196974227986, 2.332600336488709, 1.945869474662082]

3

Có thể đã có một chức năng để thực hiện những gì bạn đang tìm kiếm, nhưng tôi chưa biết về nó (?). Trong thời gian chờ đợi, tôi khuyên bạn nên sử dụng:

ran_floats = numpy.random.rand(50) * (13.3-0.5) + 0.5

Điều này sẽ tạo ra một mảng hình dạng (50,) với phân bố đồng đều giữa 0,5 và 13,3.

Bạn cũng có thể xác định một hàm:

def random_uniform_range(shape=[1,],low=0,high=1):
    """
    Random uniform range

    Produces a random uniform distribution of specified shape, with arbitrary max and
    min values. Default shape is [1], and default range is [0,1].
    """
    return numpy.random.rand(shape) * (high - min) + min

CHỈNH SỬA : Hmm, vâng, vì vậy tôi đã bỏ lỡ nó, có numpy.random.uniform () với cùng một cuộc gọi chính xác mà bạn muốn! Hãy thử import numpy; help(numpy.random.uniform)để biết thêm thông tin.


3

Vòng lặp for trong việc hiểu danh sách mất thời gian và làm cho nó chậm. Tốt hơn là sử dụng các tham số numpy (thấp, cao, kích thước, .. vv)

import numpy as np
import time
rang = 10000
tic = time.time()
for i in range(rang):
    sampl = np.random.uniform(low=0, high=2, size=(182))
print("it took: ", time.time() - tic)

tic = time.time()
for i in range(rang):
    ran_floats = [np.random.uniform(0,2) for _ in range(182)]
print("it took: ", time.time() - tic)

đầu ra mẫu:

('mất:', 0,06406784057617188)

('mất:', 1.7253198623657227)


3

Ngoài ra, bạn có thể sử dụng SciPy

from scipy import stats
stats.uniform(0.5, 13.3).rvs(50)

và đối với bản ghi để lấy mẫu số nguyên, nó

stats.randint(10, 20).rvs(50)

2

Đây là cách đơn giản nhất

np.random.uniform(start,stop,(rows,columns))

0

np.random.random_sample(size) sẽ tạo ra các phao ngẫu nhiên trong khoảng thời gian nửa mở [0.0, 1.0).

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.