Selain bilangan bulat, banyak kebutuhan meminta angka pecahan yang menyebar merata: suhu ruangan yang berfluktuasi tipis, pecahan acak sebagai bahan dasar distribusi lain, atau nilai simulasi yang boleh muncul di mana saja di dalam sebuah rentang. Distribusi yang tepat untuk itu adalah uniform distribution: setiap nilai di dalam rentang memiliki peluang yang sama untuk muncul.

Method utamanya ada dua: rng.random() untuk rentang baku [0, 1) dan rng.uniform(low, high) untuk rentang bebas. Keduanya menghasilkan nilai float64.

rng.random: Rentang Baku 0 sampai 1 #

rng.random(size) menghasilkan angka pecahan pada interval setengah-terbuka [0, 1): nilai 0.0 mungkin muncul, sedangkan nilai 1.0 tidak pernah dihasilkan:

python
import numpy as np

rng = np.random.default_rng(42)
print(rng.random())
print(rng.random(3))

Output yang Dihasilkan:

text
0.7739560485559633
[0.43887844 0.85859792 0.69736803]

Tanpa argumen size, method mengembalikan satu nilai dengan seluruh digitnya; dengan size, kita memperoleh array yang elemennya diringkas NumPy menjadi delapan desimal. Argumen size juga menerima tuple untuk array multi-dimensi. Contoh berikut sekaligus membuktikan batas interval secara empiris:

python
import numpy as np

rng = np.random.default_rng(42)
grid = rng.random((2, 3))
print(grid)
print(np.all(grid >= 0.0), np.all(grid < 1.0))

Output yang Dihasilkan:

text
[[0.77395605 0.43887844 0.85859792]
 [0.69736803 0.09417735 0.97562235]]
True True

Bedah baris demi baris:

  1. Baris 4 (rng.random((2, 3))): size berupa tuple (2, 3), sehingga hasilnya matriks dua baris x tiga kolom.
  2. Baris 5: keenam elemen tercetak, semuanya di antara 0.0 dan 1.0.
  3. Baris 6 (np.all(...)): np.all mengembalikan True hanya bila kondisi terpenuhi di seluruh elemen. Hasil True True menegaskan dua hal sekaligus: tidak ada elemen di bawah 0.0, dan tidak ada elemen yang mencapai 1.0.

rng.uniform: Rentang Bebas #

rng.uniform(low, high, size) menggeser dan memperlebar rentang tersebut. Contoh berikut mensimulasikan lima pembacaan suhu ruangan pada rentang 27,0 sampai 33,0 derajat Celsius:

python
import numpy as np

rng = np.random.default_rng(42)
suhu = rng.uniform(27.0, 33.0, size=5)
print(suhu)
rng = np.random.default_rng(42)
b = 27.0 + (33.0 - 27.0) * rng.random(5)
print(np.array_equal(suhu, b))

Output yang Dihasilkan:

text
[31.64373629 29.63327064 32.15158752 31.18420817 27.56506409]
True

Bedah baris demi baris:

  1. Baris 4 (rng.uniform(27.0, 33.0, size=5)): lima nilai pecahan pada interval [27.0, 33.0); hasilnya meliputi 31.64, 27.56, dan seterusnya, semuanya di dalam rentang.
  2. Baris 6-7: dengan seed yang sama, kita hitung 27.0 + (33.0 - 27.0) * rng.random(5) secara manual — angka uniform di [0, 1) digeser ke 27.0 lalu diperlebar enam satuan.
  3. Baris 8 (np.array_equal(suhu, b)): hasilnya True, artinya kedua array identik hingga level bit.

Hasil True membuktikan mekanisme uniform: method ini tidak lebih dari random() yang digeser dan diskalakan. Inilah alasan batas atasnya juga eksklusif — karena random() tidak pernah mencapai 1.0, nilai 27.0 + 6.0 * 1.0 = 33.0 juga mustahil muncul.

MethodInterval hasilTipe nilai
rng.random(size)[0.0, 1.0)float64
rng.uniform(low, high, size)[low, high)float64
rng.integers(low, high, size)[low, high)int64

Uji Empiris: Mean Mendekati Titik Tengah #

Jika distribusi benar-benar merata, mean dari sejumlah besar sampel harus mendekati titik tengah rentang, yaitu (low + high) / 2. Kita uji dengan satu juta sampel:

python
import numpy as np

rng = np.random.default_rng(42)
sampel = rng.uniform(10.0, 20.0, size=1_000_000)
print(sampel.mean())
print((10.0 + 20.0) / 2)

Output yang Dihasilkan:

text
15.00026476174088
15.0

Mean empiris 15.00026476174088 hanya melenceng sekitar 0.00026 dari titik tengah 15.0 — selisih sekitar 0,002 persen. Semakin besar size, semakin dekat mean empiris ke titik tengah. Angkanya persis sama di komputer mana pun karena generator di-seed — prinsip yang dibahas pada Chapter Reproducibility dan Random Seed.

Melihat Kemerataan lewat np.histogram #

Mean hanyalah satu ringkasan; kemerataan lebih terlihat bila rentang dibagi menjadi beberapa bin dan isi tiap bin dihitung — ide yang sama dengan histogram. Fungsi np.histogram mengembalikan dua array: jumlah sampel per bin dan tepi bin:

python
import numpy as np

rng = np.random.default_rng(42)
sampel = rng.random(10_000)
tepi_bin = np.linspace(0.0, 1.0, 6)
hitung, tepi = np.histogram(sampel, bins=tepi_bin)
print(hitung)
print(tepi)

Output yang Dihasilkan:

text
[2034 2000 2014 1998 1954]
[0.  0.2 0.4 0.6 0.8 1. ]

Bedah baris demi baris:

  1. Baris 5 (np.linspace(0.0, 1.0, 6)): enam titik tepi yang berjarak sama — 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 — sehingga membentuk lima bin.
  2. Baris 6: np.histogram menghitung berapa sampel yang jatuh di tiap bin.
  3. Baris 7-8: array pertama adalah hitungan per bin, array kedua adalah tepi binnya.

Isi tiap bin pada contoh kita:

BinRentang nilaiJumlah sampel
0[0.0, 0.2)2034
1[0.2, 0.4)2000
2[0.4, 0.6)2014
3[0.6, 0.8)1998
4[0.8, 1.0]1954

Kelima bin berisi sekitar 2000 sampel (10.000 dibagi 5) — tanda penyebaran yang merata. Konvensi intervalnya [a, b) untuk semua bin, kecuali bin terakhir yang juga mencakup tepi kanannya. Detail np.histogram dan kawan-kawan penghitung frekuensi ada pada Chapter Counting dan Frekuensi.

Distribusi berikutnya yang paling sering dipakai adalah sebaran normal dengan bentuk loncengnya yang khas — dibahas pada Chapter Normal Distribution. Sementara kombinasi angka acak untuk menjawab pertanyaan berbasis peluang dikupas di Chapter Simulasi Monte Carlo.