Saya belum dapat menemukan fungsi untuk menghasilkan larik pelampung acak dengan panjang tertentu antara rentang tertentu.
Saya telah melihat Random sampling tetapi tampaknya tidak ada fungsi yang melakukan apa yang saya butuhkan.
random.uniform mendekati tetapi hanya mengembalikan satu elemen, bukan nomor tertentu.
Inilah yang saya kejar:
ran_floats = some_function(low=0.5, high=13.3, size=50)
yang akan mengembalikan larik 50 pelampung non-unik acak (yaitu: pengulangan diperbolehkan) didistribusikan secara seragam dalam rentang [0.5, 13.3]
.
Apakah ada fungsi seperti itu?
numpy
, tetapi Anda tidak menyebutkannyanumpy.random.uniform
, meskipun pertanyaan tersebut memiliki tanda panggilan yang Anda inginkan. Apakah Anda memilikinumpy
perpustakaan yang tersedia?[random.uniform(low, high) for i in xrange(size)]
Jawaban:
np.random.uniform
cocok dengan kasus penggunaan Anda:sampl = np.random.uniform(low=0.5, high=13.3, size=(50,))
Perbarui Okt 2019:
Meskipun sintaksnya masih didukung, sepertinya API diubah dengan NumPy 1.17 untuk mendukung kontrol yang lebih besar atas generator bilangan acak. Untuk selanjutnya, API telah berubah dan Anda harus melihat https://docs.scipy.org/doc/numpy/reference/random/generated/numpy.random.Generator.uniform.html
Proposal peningkatan ada di sini: https://numpy.org/neps/nep-0019-rng-policy.html
sumber
some_function(low=0.5, high=13.3, size=50)
. Begitulah cara terbaik python libs dirancang #wowMengapa tidak menggunakan pemahaman daftar?
Dengan Python 2
ran_floats = [random.uniform(low,high) for _ in xrange(size)]
Di Python 3,
range
bekerja sepertixrange
( ref )ran_floats = [random.uniform(low,high) for _ in range(size)]
sumber
Mengapa tidak menggabungkan random.uniform dengan pemahaman daftar?
>>> 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]
sumber
Mungkin sudah ada fungsi untuk melakukan apa yang Anda cari, tapi saya belum mengetahuinya (belum?). Sementara itu, saya akan menyarankan menggunakan:
ran_floats = numpy.random.rand(50) * (13.3-0.5) + 0.5
Ini akan menghasilkan larik berbentuk (50,) dengan distribusi seragam antara 0,5 dan 13,3.
Anda juga bisa mendefinisikan sebuah fungsi:
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
EDIT : Hmm, ya, jadi saya melewatkannya, ada numpy.random.uniform () dengan panggilan yang sama persis dengan yang Anda inginkan! Coba
import numpy; help(numpy.random.uniform)
untuk informasi lebih lanjut.sumber
Perulangan for dalam pemahaman daftar membutuhkan waktu dan membuatnya lambat. Lebih baik menggunakan parameter numpy (rendah, tinggi, ukuran, .. dll)
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)
keluaran sampel:
('butuh:', 0,06406784057617188)
('butuh:', 1.7253198623657227)
sumber
Atau Anda bisa menggunakan SciPy
from scipy import stats stats.uniform(0.5, 13.3).rvs(50)
dan sebagai catatan untuk contoh bilangan bulat itu
stats.randint(10, 20).rvs(50)
sumber
Ini cara yang paling sederhana
sumber
np.random.random_sample(size)
akan menghasilkan float acak dalam interval setengah terbuka [0.0, 1.0).sumber