使用概率选择数组值

2024-04-29

我还有一个作业要做,那就是:

从黄色、蓝色和红色中随机选择一种颜色,概率为: 黄色:3/7 蓝色:1/7 红色:3/7


我知道我可以通过使用类似的方法来解决这个问题: 【黄黄黄蓝红红红】 但我认为这在编程上不是很好,因为当我碰巧发生这种情况时,我将不得不更改数组。

所以,我想我可以尝试一些类似体重的方法

let yellow_probability = 3/7
let blue_probability = 1/7
let red_probability = 3/7

const colors = ['yellow', 'blue', 'red']

function pickPosition(yellow_probability, blue_probability, red_probability){

    let yellow_weight = Math.random() * yellow_probability
    let blue_weight = Math.random() * blue_probability
    let red_weight = Math.random() * red_probability

    let weights = [yellow_weight, blue_weight, red_weight]

    let max_of_array = Math.max.apply(Math, weights);

    pickedColor = weights.indexOf(max_of_array)

    return pickedColor

}
pickedColorIndex = pickPosition(yellow_probability, blue_probability, red_probability)
pickedColor = colors[pickedColorIndex]
console.log(pickedColor)

我做了一个测试:

let n=1000000; 
let yellow=0, blue=0, red=0; 
for (let i=0; i<n; i++) {

    pickedColorIndex = pickPosition(yellow_probability, blue_probability, red_probability)
    if (pickedColorIndex==0) yellow++
    else if (pickedColorIndex==1) blue++
    else red++;
}
console.log("yellow = " + yellow/n );
console.log("blue = " + blue/n );
console.log("red = " + red/n );

我希望这个测试输出如下内容:

Yellow = 0.43
Blue = 0.14
Red = 0.43

但我得到:

Yellow = 0.48
Blue = 0.03
Red = 0.48

有趣的是,当概率相等 (1/3, 1/3, 1/3) 或类似 (1/2, 1/2, 0) 时,代码会起作用

谁能指出我做错了什么?


您可以创建尽可能多的不同项目,然后选择具有最大值的项目,而不是单个随机值。

这会提升具有更高因子/概率的值/项目。

除了这种方法之外,您还可以采用单个随机值并将所有概率放入一个数组中,然后检查随机值所在的区间。拿走这个物品。


编辑:代码

function getRandomIndex(probabilities) {
    var random = Math.random(),
        i;
        
    for (i = 0; i < probabilities.length; i++) {
        if (random < probabilities[i]) return i;
        random -= probabilities[i];
    }
    return probabilites.length - 1;
}

var probabilities = [3 / 7, 1 / 7, 3 / 7],
    j = 1e6,
    count = [0, 0, 0];

while (j--) count[getRandomIndex(probabilities)]++;

console.log(count);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用概率选择数组值 的相关文章

随机推荐

  • Javascript增加最大数组大小[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个大小的数组2 32 4294967296 因为我试图通过运行筛算法来获取 2 32 之前的所有素数 但是 该数组中的任何操作都会出现以下错误 致命错误 CALL AND RETRY LAST 分
  • 增加导航栏高度

    我有以下代码 func navbarbutton UIView animateWithDuration 0 2 animations gt Void in let current self navigationController navi
  • hreflang 应该如何构建?

    我的问题是 应该像上面的所有页面一样 或者应该用每个页面的实际 url 进行更改 例如
  • 缓存行对齐(需要文章澄清)

    我最近在我的应用程序中遇到了我认为是错误共享的问题 我查了一下关于如何将我的数据与缓存行对齐 他建议使用以下 C 代码 C using C 0x alignment syntax template
  • PyCharm 无法解析 docker-compose.yml 以添加 Python 解释器,似乎正在使用旧版本

    我正在设置 PyCharm 的新实例 并想使用 docker compose 设置 Python 解释器 但 PyCharm 似乎不喜欢我的 docker compose 版本 首先 在 构建 执行 部署 gt Docker gt 工具 中
  • 根据内容对列表视图中的相似行进行分组

    i have a listview that displays a set of rows each row is clickable now i wish to group similar type of rows under one h
  • Oracle 的商业 Hotspot JVM 相对于 OpenJDK 有哪些性能优势?

    正如这个问题中所描述的 OpenJDK 与 Java HotspotVM https stackoverflow com q 44335605 1593077 Oracle 的商业 Hotspot JVM 本质上是 OpenJDK 加上一些
  • JavaScript 中的异步事件处理

    我在防止双重 多重 方面遇到问题eventListener代码中的处理 var locked button addEventListener click function if locked return locked true calcu
  • 使用 JPA2/Hibernate 保留 java.time.Instant (JDK8)

    JPA 和 Hibernate 目前都不支持 JDK8 中 JSR 310 带来的新日期 时间类 JPAticket https java net jira browse JPA SPEC 63 休眠ticket https hiberna
  • 在 Blazor 中显示计时器

    我正在尝试在服务器端 Blazor 应用程序中显示倒计时器 我的代码同时使用 F 和 C 语言 该代码在某种程度上可以工作 但计时器永远不会按预期停止 并且计时器显示偶尔不会呈现所有数字 这是我第一次尝试 Blazor 服务器端应用程序 我
  • 具有 SSL 客户端证书的 iPhone 应用程序

    我正在构建一个 iPhone 应用程序 需要使用客户端证书通过 https 访问 Web 服务 如果我将客户端证书 pkcs12 格式 放入应用程序包中 我就可以将其加载到应用程序中并进行 https 调用 很大程度上要感谢 stackov
  • Security.h 中结构的 macOS 文档

    我正在尝试使用Security h通过 Java 和 JNA 的 macOS 框架 这意味着我需要将某些结构重建为 Java 类 问题是 当我查看文档中的结构时 this one https developer apple com refe
  • 如何将温莎城堡与 ASP.Net Web 表单一起使用?

    我正在尝试将 Windsor 的依赖注入连接到标准的 asp net Web 表单 我想我已经使用 HttpModule 和 CustomAttribute 代码如下所示 实现了这一点 尽管该解决方案似乎有点笨拙 并且想知道 Windsor
  • 按广度优先顺序列出目录所有内容导致效率低下

    我编写了一个 Haskell 模块来按广度优先顺序列出目录的所有内容 下面是源代码 module DirElements dirElem where import System Directory getDirectoryContents
  • Sinon.js 结合 CalledWith 次数

    我知道与sinon js https sinonjs org您可以测试间谍是否被呼叫一定次数 sinon assert calledTwice mySpy someMethod 您可以测试是否使用某些参数调用了间谍 sinon assert
  • 像 Java 一样覆盖 Objective-C 类中的方法

    我经常使用此语句来扩展类 而不需要编写整个单独的文件 假设 ClassFromFramework 是库中包含的框架的一部分的类 public ClassFromFramework public String myMethod operati
  • 使用特定区域设置启动 Google Chrome(使用命令行参数)

    如何使用命令行参数以特定区域设置启动 Google Chrome 根据http peter sh experiments chromium command line switches http peter sh experiments ch
  • MIME 类型/内容类型,用于在 IE 和 Firefox 中使用 Excel 打开 CSV 文件

    我在 Excel 中识别并打开 CSV 输出时遇到问题 在我的 Web 应用程序中 我有一个 java servlet 它将搜索结果返回给用户 搜索结果由 Apache Solr 服务器提供 GUI 前端有一个选项 允许用户请求 CSV 格
  • 生成唯一随机数的智能方法

    我想生成 00000001 到 99999999 范围内的唯一随机数序列 所以第一个可能是 00001010 第二个可能是 40002928 等等 最简单的方法是生成一个随机数并将其存储在数据库中 下次再执行一次并检查数据库中该数字是否已存
  • 使用概率选择数组值

    我还有一个作业要做 那就是 从黄色 蓝色和红色中随机选择一种颜色 概率为 黄色 3 7 蓝色 1 7 红色 3 7 我知道我可以通过使用类似的方法来解决这个问题 黄黄黄蓝红红红 但我认为这在编程上不是很好 因为当我碰巧发生这种情况时 我将不