Вероятность получения fi sh элемента Вероятность - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь получить процент от получения фи sh. X здесь уникальное число, оно между 0-99, но в моем примере кода это 70, для целей тестирования.

Но в настоящее время он возвращает действительно неправильные результаты, так что я здесь что-то делаю не так.

Токовый выход:

[-0.17142857142857143, 0.04285714285714286, 0.2571428571428571, 0.2714285714285714]

Что означает

  • -17% для получения fish1,
  • 4,2% для fish2 ,
  • 25,7% fish3,
  • 27% fish4.

Правильная математика выглядит следующим образом:

Если число X 82+, получится fi sh 1. Если число X 67+, это fi sh 2 (если 82+ et c). Если число х 52+, то это fi sh 3. Если 51 или меньше, это fi sh 4.

Так что, теоретически, с x 85, это 3/85 шанс его получения.

Тогда мне нужна текущая X вероятность получения этого значения c fi sh. Что я тут не так делаю?

function fishesPercentage(X) {
  var NumberSelected = RandomNumber(0,X-1);
  NumberSelected = 70;
  console.log("RANDOOM NUMBER IS : ",NumberSelected);
  let Fish1 = NumberSelected - 82;
  let Fish2 = NumberSelected - 67;
  let Fish3 = NumberSelected - 52;
  let Fish4 = NumberSelected - 51;

  return [
    Fish1/ NumberSelected,
    Fish2/ NumberSelected,
    Fish3/ NumberSelected,
    Fish4/ NumberSelected
  ];
}

1 Ответ

0 голосов
/ 21 января 2020

Требуются вероятности получения рыб с 1 по 4 для заданного числа X и ряда диапазонов. Общее количество рыб:

Fi sh 4) 51 или X (если X ниже)

Fi sh 3) 68-51 o X-51 (если X ниже 68)

et c.

Если какой-либо из этих XN отрицателен, это означает, что нет рыб этого типа.

Это может быть достигается с помощью любой из двух функций ниже:

function fishProb(x) {
    let fish4 = Math.max(Math.min(x, 51),0)
    let fish3 = Math.max(Math.min(x-51, 68-51),0)
    let fish2 = Math.max(Math.min(x-68, 82-68),0)
    let fish1 = Math.max(Math.min(x-82, 99-82),0)
    return([fish1, fish2, fish3, fish4].map(f => f/x))
}

function fishProb2(x) {
    var allFishes = x
    var fishType = [51, 68-51, 82-68, 99-82]
    var fishes = []
    for (const currentFishes of fishType) {
        fishes.push( Math.max(Math.min(allFishes, currentFishes), 0) )
        allFishes -= currentFishes
    }
   return(fishes.map(f => f/x).reverse())
}

Обе функции возвращают одно и то же. Второй, я думаю, выражает проблему более простым способом.

Если у вас X = 70, то у вас есть 51 Fish4, из оставшихся 70-51 у вас есть (68-51) из Fish3, а остальные 3 - это Fish2. В лоте нет Fish1.

//X = 70
[0, 0.02857142857142857, 0.24285714285714285, 0.7285714285714285]

//X = 85
[0.03529411764705882, 0.16470588235294117, 0.2, 0.6]

//X = 20. In this case you only have 20 Fish4 and none of the others.
[0, 0, 0, 1]
...