Artikel ini membawa anda pengetahuan yang berkaitan tentang java, yang terutamanya memperkenalkan transformasi fungsi rawak dalam Java Kod sampel dalam artikel diterangkan secara terperinci, yang akan membantu kita mempelajari Java. Yang berminat boleh belajar lebih lanjut.
Kajian yang disyorkan: "tutorial video java"
Fungsi Math.random()
dalam Java mengembalikan sebarang perpuluhan dalam selang [0,1)
dengan kebarangkalian yang sama. Iaitu, dalam kes x < 1
, kebarangkalian nombor dalam [0,x)
muncul ialah x
Jika kita ingin melaraskan kebarangkalian nombor dalam x < 1
kepada [0,x)
dalam kes , apa yang perlu kita lakukan? x^2
ialah [0,x)
, maka panggil x
dua kali Jika nilai yang lebih besar juga berada dalam selang Math.random()
, maka Kedua-duanya memanggil mestilah dalam selang [0,x)
(kerana bila-bila masa dalam [0,x)
akan menyebabkan nilai pulangan tidak berada pada [x,1)
), iaitu kebarangkalian adalah [0,x)
dan kodnya adalah seperti berikut x^2
package snippet; public class Code_0004_RandToPow2 { // 将`[0,x)`中的数出现的的概率调整成`x^2` public static double randToPow2() { return Math.max(Math.random(), Math.random()); } }Kami boleh Gunakan kod ujian berikut untuk mengesahkan penyelesaian kepada soalan 1:
package snippet; public class Code_0004_RandToPow2 { // 将`[0,x)`中的数出现的的概率调整成`x^2` public static double randToPow2() { return Math.max(Math.random(), Math.random()); } // 测试用例 public static void main(String[] args) { int count = 0; int testTimes = 10000000; double x = 0.17; for (int i = 0; i < testTimes; i++) { if (randToPow2() < x) { count++; } } System.out.println((double) count / (double) testTimes); System.out.println(Math.pow(x, 2)); } }Keputusan yang dicetak adalah seperti berikut
0.02886030.0289000000060 🎜>
Dekat dengan keperluan sasaran .
Soalan 2
dengan kebarangkalian yang sama. Bagaimana untuk menggunakan fungsi f()
[1,5]
Tanpa memperkenalkan fungsi rawak lain, kami mendapat fungsi yang mengembalikan sebarang nombor dalam f()
dengan kebarangkalian yang sama. [1,7]
Ideag()
, jika kita boleh memproses fungsi
, fungsi ini akan mengembalikan mana-mana satu dalam julat dengan nombor kebarangkalian yang sama, maka fungsi objektif [1,7]
hanya perlu memanggil fungsi x()
tambah 1 ini, iaitu fungsi [0,6]
memerlukan g()
x()
g()
untuk mendapatkan
public static int g() { return x() + 1; }Anda perlu mendapatkan fungsi rawak dahulu
[0,6]
yang mengembalikan 0 dan 1 dengan kebarangkalian yang sama Kita boleh mendapatkannya melalui fungsi , iaitu m()
f()
mempunyai kebarangkalian yang sama untuk mengembalikan 0 dan 1. Fungsi rawak
// 通过[0,5]等概率返回的随机函数f() // 加工出等概率得到0和1 // 1,2,3,4,5 五个数 // 得到1,2的时候,返回0 // 得到4,5的时候,返回1 // 得到3的时候,弃而不用,再次尝试 public static int m() { int ans = 0; do { ans = f(); } while (ans == 3); return ans < 3 ? 0 : 1; }kaedah yang secara rawak mengembalikan nombor dengan kebarangkalian yang sama, kerana
memerlukan tiga nombor binari untuk mewakili , maka kita boleh memanggil fungsi m()
tiga kali, dan kita boleh mendapatkan keputusan dengan kebarangkalian yang sama Untuk sebarang nombor dalam julat [0,6]
, kita boleh mencuba semula proses di atas apabila kita mendapat 7, dan hanya hasilnya akan dikembalikan apabila ia [0,6]
, dengan itu memproses fungsi m()
. [0,7]
[0,6]
x()
Akhir sekali, fungsi objektif
// 等概率返回0~6 public static int x() { int ans = 0; do { ans = (m() << 2) + (m() << 1) + m(); } while (ans == 7); return ans; }
f()
. Kod lengkap adalah seperti berikut
// 等概率返回1~7 public static int g() { return x() + 1; }
Soalan 3
package snippet; public class Code_0005_Rand5ToRand7 { // 此函数只能用,不能修改 // 等概率返回1~5 public static int f() { return (int) (Math.random() * 5) + 1; } // 通过[0,5]等概率返回的随机函数f() // 加工出等概率得到0和1 // 1,2,3,4,5 五个数 // 得到1,2的时候,返回0 // 得到4,5的时候,返回1 // 得到3的时候,弃而不用,再次尝试 public static int m() { int ans = 0; do { ans = f(); } while (ans == 3); return ans < 3 ? 0 : 1; } // 等概率返回0~6 public static int x() { int ans = 0; do { ans = (m() << 2) + (m() << 1) + m(); } while (ans == 7); return ans; } // 等概率返回1~7 public static int g() { return x() + 1; } }
adalah sama seperti soalan 2. Intinya ialah untuk melaksanakan yang sama terlebih dahulu kebarangkalian mengembalikan 0 dan fungsi Rawak
daripada 1., dan kemudian lihat berapa banyak bit perduaan yang diperlukan dalam selang fungsi sasaran untuk menentukan berapa kali untuk memanggil fungsi Saya tidak akan pergi ke butiran untuk kod lengkap, lihat m()
m()
Soalan 4
/** * The rand7() API is already defined in the parent class SolBase. * public int rand7(); * @return a random integer in the range 1 to 7 */ class Solution extends SolBase { public int rand10() { return rand(10); } public int rand(int N) { int bit = 1; int base = 2; while (base <= N) { base = 2 << bit; bit++; } int v = build(bit); while (v < 1 || v > N) { v = build(bit); } return v; } private int build(int bit) { int v = 0; for (int i = 0; i < bit; i++) { v += (m() << i); } return v; } // 核心:生成 0 和 1 等概率返回的随机函数 public int m() { int i = rand7(); while (i == 7) { i = rand7(); } return (i == 1 || i == 2 || i == 3) ? 0 : 1; } }Terdapat satu Fungsi
, f()
f()
idea, g()
dua kali, anda boleh mendapatkan situasi berikut
f()
0 0
0 11 0
Apabila kedua-dua masa adalah 0, atau kedua-dua masa adalah 1, buangkannya Walaupun kebarangkalian 0 dan 1 adalah berbeza,
0 1
1 0Jadi jika anda mendapat
Kebarangkalian mestilah sama
, anda akan kembali 0, jika anda mendapat
, anda akan mengembalikan 1, iaitufungsi0 1
1 0
Kod lengkap adalah seperti berikutg()
Pembelajaran yang disyorkan: "
tutorial video javapackage snippet; // 不等概率随机函数变成等概率随机函数 public class Code_0005_EqualProbabilityRandom { // 不等概率函数, // 内部内容不可见 public static int f() { return Math.random() < 0.8 ? 0 : 1; } // 等概率返回0和1 public static int g() { int first; do { first = f(); // 0 1 } while (first == f()); return first; } }"
Atas ialah kandungan terperinci Penjelasan terperinci tentang contoh transformasi fungsi rawak di Jawa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!