当前位置: 首页 > 知识库问答 >
问题:

基于概率和百分比的返回值

宰父学
2023-03-14

关于这些例子,你知道我如何实现概率吗。

let directions = [
    {
        1: {
            left: {
                successRate: 1,
                direction: 0
            },
            top: {
                successRate: 35,
                direction: 1
            },
            right: {
                successRate: 15,
                direction: 2
            },
            bottom: {
                successRate: 5,
                direction: 3
            }
        },
    }
]
  1. 应该在属性中循环
  2. 在顶部、右侧、底部和左侧循环以检索其成功率值
  3. 随机检索一个方向,根据它的成功率(也就是它的概率)与所有东西进行比较。概率越高的人被呼叫的几率越高

程序在setInterval内,每次interval循环时,都会打印值。我尝试了很多不同的方法,但我想不出来。

更新对于我目前遇到的实际问题。

您可以忽略“未找到”。它只是一个随机字符串。数字根据概率随机生成,但在setInterval函数中调用x次后,它变得“未定义”。

代码:

let directions = [
    {
        1: {
            left: {
                successRate: 5,
                direction: 0
            },
            top: {
                successRate: 3,
                direction: 1
            },
            right: {
                successRate: 10,
                direction: 2
            },
            bottom: {
                successRate: 30,
                direction: 3
            }
        },
    }
]

var chances = [40, 30, 15, 10, 5]; 
let items = Object.values(directions[0][1]);

function chooseWeighted(items, chances) {
    var sum = chances.reduce((acc, el) => acc + el, 0);
    var acc = 0;
    chances = chances.map(el => (acc = el + acc));
    var rand = Math.random() * sum;
    return items[chances.filter(el => el <= rand).length];
}

function scanPlayerArea(){
    console.log(chooseWeighted(items, chances).direction);
}

输出:

Not found.
1
Not found.
0
Not found.
0
Not found.
2
Not found.
0
Not found.
1
Not found.
1
Not found.
0
Not found.
0
Not found.
C:\Users\Name\Desktop\Script\file.js:1351
    dir = chooseWeighted(items, chances).direction;
                                        ^

TypeError: Cannot read property 'direction' of undefined
    at scanPlayerArea (C:\Users\Name\Desktop\Script\file.js:1351:41)
    at Timeout._onTimeout (C:\Users\Name\Desktop\Script\file.js:1633:6)
    at listOnTimeout (internal/timers.js:549:17)
    at processTimers (internal/timers.js:492:7)

C:\Users\Name\Desktop\Script>

循环:

setInterval(function(){
    scanPlayerArea()
}, 50);

共有1个答案

鲜于允晨
2023-03-14

如果我理解正确,您希望在每次迭代中根据成功率属性上设置的概率拾取随机方向。如果是这样,我可以想到一种方法:

let directions = [
    {
        1: {
            left: {
                successRate: 5,
                direction: 0
            },
            top: {
                successRate: 3,
                direction: 1
            },
            right: {
                successRate: 10,
                direction: 2
            },
            bottom: {
                successRate: 30,
                direction: 3
            }
        },
    }
];

const items = directions[0][1];

// Calculate the total rate 100%, just a sum of all the items
let totalRate = 0;
for (var key of Object.keys(items)) {
    totalRate += items[key].successRate;
}

// Calculate the coeficient of success rate for each item and save it in items
let lastCoef = 0;
for (var key of Object.keys(items)) {
  items[key].coef = lastCoef + items[key].successRate / totalRate;
  lastCoef = items[key].coef;
  console.log(key + ' coeficient: ' + lastCoef);
}

function chooseWeighted(items) {
  const randomNum = Math.random();
  for (var key of Object.keys(items)) {
    if(randomNum < items[key].coef) {
      return key;
    }
  }
}

function scanPlayerArea(){
  console.log(chooseWeighted(items));
}

setInterval(function(){
  scanPlayerArea();
}, 1000);
 类似资料:
  • 我有以下代码片段: 我的问题是,它真的计算出25%的概率在这里获胜吗?球员在这里获胜的几率真的是25%吗? 编辑: 我刚刚写了这个: 它非常不准确。它从大约0.15到0.3。 但是当我做更多的检查时(从(i 这是为什么?为什么100张支票不够精确?

  • 我希望使用本文提供的答案从列表中随机选择独特的项目。 按照所描述的方法,在我的循环的每次迭代中,我都会生成一个概率值,它是当前项目从列表中被选中的概率百分比。 我需要知道的是,我如何使用这个百分比值来选择项目(或不选择)。 这是我拥有的代码,是

  • 我需要根据该值被选择的百分比概率选择一个值。例如: 时间增量值a的10% 时间增量值b的20% 时间增量值c的30% 时间增量值d的40% 百分比加起来总是正好100% 我遇到过几种像这样的解决方案,但我确定它们不可能是正确的。以下是使用上述解决方案构建的示例程序: 输出: 预期输出: 我相信我需要使用某种算法将百分比转换为从0到99的刻度,以便随机数生成器可以准确地选择一个值。不过,我想不出如何

  • 让我们假设我有一个这样的结构化数组: 我将这个结构称为“categories”,所以,我在这个数组中有六个类别。我的目标是根据一个类别随机挑选一个产品。 我想做一个基于速率的类别选择,据我所知,我必须计算这个类别在数组中代表多少百分比,例如: 这会给我类似的东西: 好的,现在我要做一个简单的算法,根据这些比率得到类别;我想我现在需要在范围之间选择一个随机数,并制作一些“切片”,例如: 如果随机数介

  • 问题内容: 制作按宽度占据其父容器固定百分比的容器的最简单方法是什么? 当其父容器的宽度更改时,其宽度应更新。 我尝试使用,但是当父容器的宽度更改时,它不会更新。 问题答案: 您想要的是GridBagLayout。(如何使用?) 使用GridbagLayout可以为添加的每个单个组件定义GridBagConstraints。 这些限制条件包括其在锡罐上的确切说明。这是在“网格行”中所有组件上计算的

  • 我试图实现的是一个测试的评分系统,但是如果有错误的答案,变量总是返回0。 参考代码: