Rumah  >  Artikel  >  Java  >  Penjelasan terperinci tentang contoh transformasi fungsi rawak di Jawa

Penjelasan terperinci tentang contoh transformasi fungsi rawak di Jawa

WBOY
WBOYke hadapan
2022-08-24 11:59:021838semak imbas

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.

Penjelasan terperinci tentang contoh transformasi fungsi rawak di Jawa

Kajian yang disyorkan: "tutorial video java"

Masalah diselesaikan

Masalah 1

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

Soalan 1 Idea

Memandangkan kebarangkalian

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.0288603

0.0289000000060 🎜>

Dekat dengan keperluan sasaran .

Soalan 2

Andaikan kita mempunyai fungsi rawak

. Fungsi ini boleh mengembalikan nombor dalam

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()

Memandangkan matlamatnya adalah untuk mengembalikan satu dengan kebarangkalian yang sama

, 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

dan mengembalikan nombor dengan kebarangkalian yang sama, kita
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

, kita boleh dengan mudah menjana
// 通过[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

boleh diperolehi seperti berikut:
    // 等概率返回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

mengembalikan 0 dan 1 dengan kebarangkalian tidak sama (tetapi kebarangkalian tetap Bagaimana untuk mendapatkan fungsi rawak

yang mengembalikan 0 dan 1 dengan kebarangkalian yang sama). hanya melalui fungsi

, f()f() idea, g()

Panggil fungsi

dua kali, anda boleh mendapatkan situasi berikut

f()0 0

1 1
0 1

1 0


Apabila kedua-dua masa adalah 0, atau kedua-dua masa adalah 1, buangkannya Walaupun kebarangkalian 0 dan 1 adalah berbeza,

0 1

1 0


Kebarangkalian mestilah sama

Jadi jika anda mendapat

, anda akan kembali 0, jika anda mendapat

, anda akan mengembalikan 1, iaitu

fungsi0 11 0Kod lengkap adalah seperti berikutg()

Pembelajaran yang disyorkan: "

tutorial video java
package 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!

Kenyataan:
Artikel ini dikembalikan pada:jb51.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam