Rastgele mukavemet değerlerinin üretilmesi için algoritma ayarlamak

3 Cevap php

Birkaç gün önce, you helped me to find out an algorithm for generating random strength values in an online game (thx especially John Rasch).

function getRandomStrength($quality) {
    $rand = mt_rand()/mt_getrandmax();
    $value = round(pow(M_E, ($rand - 1.033) / -0.45), 1);
    return $value;
}

Bu fonksiyon, 1.1 ve 9.9 arasında değerler üretir. Şimdi bana aynı olasılık değerlerini verir, böylece bu işlevi ayarlamak istiyorum ama başka aralığında, örneğin 1,5-8,0. Ek parametreleri ile bu elde edebiliriz eğer mükemmel olurdu.

Bana yardımcı olabilir, çok iyi olurdu. Şimdiden teşekkürler!

3 Cevap

9.9 - değerleri 1.033 ve orijinal kodu -0.45 ölçeğini 1.1 sağlayacak sihirli sayılardır. Eğer aşağıdaki kodda parametrelerin $low ve $high olarak 1.1 ve 9.9 geçmek eğer aynı sonuçları almak gerekir.

function getRandomStrength($low, $high) {
    // TODO: validate the input
    $ln_low = log( $low, M_E );
    $ln_high = log( $high, M_E );
    $scale = $ln_high - $ln_low;

    $rand = ( mt_rand() / mt_getrandmax() ) * $scale + $ln_low;
    $value = round( pow( M_E, $rand), 1 );
    return $value;
}

Sen $low ve $high için herhangi bir aralığı geçmek ve bu aralıkta bir logaritmik dağılım almak gerekir. (Ben size kontrol aralığı geçerliliğini bırakacağım, ama 0 <$low <$high doğru olmalıdır.)

Bu geri verilen aralıktaki logaritmik ölçek oluşturulması için gerekli olan doğrusal bir ölçek hesaplayarak çalışır. Ben benim log ölçeği 1.1 olmak istiyorsan - 2,2925 - 9.9, örneğin, bana 0,0953 vererek, bu değerlerin her birinin doğal günlüğünü alır. Ben o zaman bu linear aralığında rastgele bir sayı üretmek, ve e geri günlük aralığına dönüştürmek için rastgele güç yükseltmek.

Bir şekilde sadece değerlerini büyütmek olacaktır:

function getRandomStrength($quality,$min,$max) {
    $rand = mt_rand()/mt_getrandmax();
    $value = round(pow(M_E, ($rand - 1.033) / -0.45), 1);
    $value = $value - 1.1
    $value = $value * ((max-min) / 8.8)
    $value = $value + $min
    return $value;
}

Ölçek ve normalleştirilmiş aralığında dağılımını yerinden:

D(a,b) = (D(0,1)*(b-a))+a

Orijinal fonksiyonu D (c, d) birinci D (0,1) almak için, tersini yapın:

D(0,1) = (D(c,d)-c)/(d-c)

Senin durumunda, D orijinal fonksiyonu (üstel fonksiyonu) olan, b 8.5, 1.5, 1.1 c ve d 9,9 olduğunu