Rumah  >  Soal Jawab  >  teks badan

php - pengisihan algoritma probabilistik

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梦2722 hari yang lalu733

membalas semua(2)saya akan balas

  • 黄舟

    黄舟2017-05-24 11:35:58

    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

    balas
    0
  • 我想大声告诉你

    我想大声告诉你2017-05-24 11:35:58

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

    balas
    0
  • Batalbalas