Dalam dokumentasi dikatakan bahwa ada peluang yang uniform(0,1)
dapat menghasilkan nilai 0
dan 1
.
Saya telah menjalankan uniform(0, 1)
10.000 kali, tetapi tidak pernah menghasilkan nol. Bahkan dalam kasus uniform(0, 0.001)
.
Bisakah random.uniform(0,1)
pernah menghasilkan 0
atau 1
?
python
random
uniform-distribution
Venkatesh Gandi
sumber
sumber
X ~ U(0,1)
, makaP(X=x)
adalah hampir pasti 0, untuk semua nilai x. (Ini karena ada banyak kemungkinan nilai dalam interval.) Jika Anda mencari tepat 0 atau 1, Anda harus menggunakan fungsi yang berbedarandom.choice
random.uniform
?Math.random()
bekerja dalam JavaScript, misalnya).random.uniform(0, 1)
0 pada panggilan pertamaJawaban:
uniform(0, 1)
dapat menghasilkan0
, tetapi tidak akan pernah menghasilkan1
.The dokumentasi memberitahu Anda bahwa endpoint
b
dapat dimasukkan dalam nilai-nilai yang dihasilkan:Jadi untuk
uniform(0, 1)
, formula0 + (1-0) * random()
, disederhanakan1 * random()
, harus mampu menghasilkan dengan1
tepat. Itu hanya akan terjadi jikarandom.random()
1.0exactly. However,
acak ()*never* produces
1.0`.Mengutip
random.random()
dokumentasi :Notasi
[..., ...)
berarti bahwa nilai pertama adalah bagian dari semua nilai yang mungkin, tetapi yang kedua tidak.random.random()
akan paling nilai produk sangat dekat dengan1.0
.float
Jenis Python adalah nilai floating point IEEE 754 base64 , yang mengkodekan sejumlah fraksi biner (1/2, 1/4, 1/5, dll.) Yang membentuk nilai, dan nilai yangrandom.random()
dihasilkan hanyalah jumlah dari suatu pemilihan acak dari 53 fraksi tersebut dari2 ** -1
(1/2) hingga2 ** -53
(1/9007199254740992).Namun, karena dapat menghasilkan nilai yang sangat dekat
1.0
, bersama dengan kesalahan pembulatan yang terjadi ketika Anda mengalikan nubmers floating point, Anda dapat menghasilkanb
untuk beberapa nilaia
danb
. Tetapi0
dan1
tidak di antara nilai-nilai.Catatan yang
random.random()
dapat menghasilkan 0,0, jadia
selalu termasuk dalam nilai yang mungkin untukrandom.uniform()
(a + (b - a) * 0 == a
). Karena ada2 ** 53
nilai berbeda yangrandom.random()
dapat menghasilkan (semua kemungkinan kombinasi dari 53 pecahan biner), hanya ada2 ** 53
peluang 1 in (jadi 1 dalam 9007199254740992) yang pernah terjadi.Jadi nilai tertinggi yang
random.random()
dapat dihasilkan adalah1 - (2 ** -53)
; cukup pilih nilai yang cukup kecil untukb - a
memungkinkan pembulatan menendang ketika dikalikan denganrandom.random()
nilai yang lebih tinggi . Semakin kecilb - a
, semakin besar kemungkinan hal itu terjadi:Jika Anda menekan
b = 0.0
, maka kami telah membagi 1023 kali, nilai di atas berarti kami beruntung setelah 1019 divisi. Nilai tertinggi yang saya temukan sejauh ini (menjalankan fungsi di atas dalam satu lingkaran denganmax()
) adalah8.095e-320
(1008 divisi), tetapi mungkin ada nilai yang lebih tinggi. Ini semua adalah permainan kebetulan. :-)Hal ini juga dapat terjadi jika tidak ada banyak langkah terpisah antara
a
danb
, seperti kapana
danb
memiliki eksponen yang tinggi dan mungkin tampak jauh lebih jauh. Nilai titik apung masih hanya perkiraan, dan jumlah nilai yang dapat dikodekannya terbatas. Misalnya, hanya ada 1 fraksi biner perbedaan antarasys.float_info.max
dansys.float_info.max - (2 ** 970)
, sehingga ada kemungkinan 50-50random.uniform(sys.float_info.max - (2 ** 970), sys.float_info.max)
menghasilkansys.float_info.max
:sumber
"Beberapa kali" tidak cukup. 10.000 tidak cukup.
random.uniform
memilih dari antara 2 ^ 53 (9.007.199.254.740.992) nilai yang berbeda. Anda tertarik pada keduanya . Dengan demikian, Anda harus berharap untuk menghasilkan beberapa nilai acak kuadriliun sebelum mendapatkan nilai yang tepat 0 atau 1. Jadi itu mungkin, tetapi sangat mungkin Anda tidak akan pernah mengamatinya.sumber
uniform(0, 1)
tidak mungkin menghasilkan1
sebagai hasilnya. Itu karena fungsi hanya didefinisikan sebagaidef uniform(a, b): return a + (b - a) * random()
danrandom()
tidak pernah dapat menghasilkan1.0
.Anda dapat mencoba dan membuat loop yang menghitung jumlah iterasi yang diperlukan untuk ditampilkan dengan tepat 0 (jangan).
Selanjutnya, seperti yang dinyatakan oleh Hobbs, jumlah nilai yang
uniformly
dijadikan sampel adalah 9.007.199.254.740.992. Yang berarti kemungkinan melihat 0 adalah tepat 1 / 9.007.199.254.740.992. Yang secara umum dan pembulatan berarti Anda akan membutuhkan rata-rata 10 quatrillion sampel untuk menemukan 0. Tentu saja Anda mungkin menemukannya dalam 10 upaya pertama Anda, atau tidak pernah.Pengambilan sampel 1 tidak dimungkinkan karena interval yang ditentukan untuk nilai-nilai ditutup dengan tanda kurung, karenanya tidak termasuk 1.
sumber
Tentu. Anda sudah berada di jalur yang benar dengan mencoba
uniform(0, 0.001)
saja. Terus membatasi batas-batas yang cukup untuk mewujudkannya lebih cepat.sumber