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?


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

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 .


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.


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 .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.