Bagaimana cara mendapatkan nomor acak antara rentang float?

414

randrange(start, stop)hanya membutuhkan argumen integer. Jadi bagaimana saya mendapatkan angka acak antara dua nilai float?

Mantis Toboggan
sumber
2
Jika Anda ingin numpy, itu np.random.uniform(start, stop)atau np.random.uniform(start, stop, samples)jika Anda ingin beberapa sampel. Kalau tidak, jawaban di bawah ini yang terbaik.
sachinruk

Jawaban:

650

Gunakan acak. Seragam (a, b) :

>>> random.uniform(1.5, 1.9)
1.8733202628557872
Yuri Stuken
sumber
4
dapatkah ini secara teoritis menghasilkan 1,5 dan 1,9? atau apakah hanya akan menghasilkan 1,50 ~ 1 dan 1,89 ~?
Musixauce3000
14
@ Musixauce3000 Jawaban Singkat: Ya. Jawaban yang lebih panjang: Jika Anda melihat dokumentasi itu menyatakan Returns a random floating point number N such that a <= N <= b for a <= b and b <= N <= a for b < aDengan kata lain output Ndapat sama dengan input adan b. Dalam hal ini 1.5dan 1.9.
Dan
Apakah ada cara lain untuk melakukan ini tanpa menggunakan .uniformfungsi, tetapi sebaliknya dengan salah satu .randomatau randrange?
DerryckDX
1
@DerryckDX 1.5 + random.random() * (1.9 - 1.5)harus melakukannya, meskipun menurut spesifikasi ini tidak akan pernah kembali persis 1.9(bahkan secara teori).
Yonatan N
@ Musixauce3000 tampaknya uniform(a, b)diimplementasikan sebagai a + (b-a) * random()dan mengembalikan angka acak dalam kisaran [a, b) atau [a, b] tergantung pada pembulatan github.com/python/cpython/blob/…
Pavel
74

random.uniform(a, b)tampaknya apa yang Anda cari. Dari dokumen:

Kembalikan angka floating point acak N sehingga a <= N <= b untuk a <= b dan b <= N <= a untuk b <a.

Lihat di sini .

garnertb
sumber
47

jika Anda ingin menghasilkan float acak dengan N digit di sebelah kanan titik, Anda bisa membuatnya:

round(random.uniform(1,2), N)

argumen kedua adalah jumlah desimal.

Baurin Leza
sumber
Saya tidak tahu mengapa ini tidak memiliki lebih banyak upvotes, yang lain tidak memiliki mekanisme pembulatan.
TheTechRobo36414519
2

Paling umum, Anda akan menggunakan:

import random
random.uniform(a, b) # range [a, b) or [a, b] depending on floating-point rounding

Python menyediakan distribusi lain jika Anda perlu.

Jika sudah numpymengimpor, Anda dapat menggunakan yang setara:

import numpy as np
np.random.uniform(a, b) # range [a, b)

Sekali lagi, jika Anda membutuhkan distribusi lain, numpysediakan distribusi yang sama dengan python, dan juga banyak tambahan lainnya .

stwykd
sumber