php - pengisihan algoritma probabilistik
过去多啦不再A梦
过去多啦不再A梦 2017-05-24 11:33:58
0
2
737

Bagaimana untuk mengisih data mengikut kebarangkalian supaya setiap selang kebarangkalian mempunyai keputusan?

Sebagai contoh, andaikan terdapat satu set data seperti berikut

{
a: 40,
b: 20,
c: 10,
d: 5,
e: 5,
f: 5,
g: 5,
h: 5,
i: 3,
j: 2
}

Key ialah nilai yang hendak diisih, dan nilai ialah kebarangkalian setiap nilai yang muncul pada kedudukan itu dalam tatasusunan Sebagai contoh, a mempunyai kebarangkalian 40% untuk muncul pada kedudukan 0 dalam tatasusunan , a mempunyai peluang 40% untuk dipaparkan pertama dalam tatasusunan, dan kemudian yang lain diisih mengikut algoritma berdasarkan kebarangkalian.

Penyelesaian semasa saya (Kaedah Rendah, dan ia tidak boleh terus disokong apabila tatasusunan mengembang):
1 Bahagikan selang mengikut kebarangkalian sedia ada, dengan mengandaikan bahawa selang a ialah 0-40, dan selang b ialah. 40-60, c ialah 60-70, dan seterusnya
2 Gunakan fungsi untuk mendapatkan nombor rawak dalam julat 1-100, dan kemudian lemparkan hasilnya (iaitu, letakkannya dalam selang yang sepadan)

.

Kod adalah seperti berikut (mencari idea pengoptimuman)

public function getRandValue($rate, $max, $min, $arr)
    {
        while (count($rate)) {
            $rand = $this->getRand($min, $max);

            if (0 < $rand && $rand <= 40) {
                $num = 40;
            } else if (40 < $rand && $rand <= 60) {
                $num = 20;
            } else if (60 < $rand && $rand <= 70) {
                $num = 10;
            } else if (70 < $rand && $rand <= 75) {
                $num = 5;
            } else if (75 < $rand && $rand <= 80) {
                $num = 5;
            } else if (80 < $rand && $rand <= 85) {
                $num = 5;
            } else if (85 < $rand && $rand <= 90) {
                $num = 5;
            } else if (90 < $rand && $rand <= 95) {
                $num = 5;
            } else if (95 < $rand && $rand <= 98) {
                $num = 3;
            } else if (98 < $rand && $rand <= 100) {
                $num = 2;
            }

            if (!in_array($num, $arr) && in_array($num, array(40, 20, 10, 3, 2))) {
                $arr[] = $num;
            } elseif (!in_array($num, array(40, 20, 10, 3, 2))) {
                $arr[] = $num;
            }

            if (count($arr) >= 10) {
                break;
            }
        }


        return $arr;
    }

Masalah yang dihadapi: (penghakiman in_array adalah kerana nilai selang ini hanya boleh dikira sekali)
1 Nilai yang dikira tidak semestinya mempunyai nilai setiap selang
2

Saya juga berharap anda dapat memberi saya nasihat dan nasihat, terima kasih semua!

过去多啦不再A梦
过去多啦不再A梦

membalas semua(2)
黄舟

Saya rasa ada masalah dengan soalan ini Input sebegitu pun tidak menjamin bahawa pengedaran yang memenuhi syarat wujud.

Dengan {a: 60, b: 40} 为例:全排列的空间是{ab, ba}. Kemudian mengikut definisi anda sepatutnya:

a出现在位置0的概率为60%,所以 P(ab) = 0.6

且

b出现在位置1的概率为40%,所以 P(ab) = 0.4
我想大声告诉你

Sama seperti apa yang saya tulis == Saya juga ingin tahu bagaimana untuk mengembangkan

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!