【算法学习系列】03 - 由[1-5]等概率随机实现[2-10]等概率随机

news2025/1/15 19:44:31

文章目录

  • 约定条件说明
  • 解决方案
    • 构造 0 1 发生器函数 f2()
    • 计算需要几个二进制位
    • 验证 2-10 等概率返回某个整数
  • 总结

约定条件说明


  • 假定 f() 是一个函数,保证 [1, 5] 范围内等概率返回一个整数
  • 实现 2-10 等概率随机不能使用 Math.random() 函数,只能使用函数 f()。

解决方案


  • 首先这个函数 f() 是给定的条件,正常直接调用就好,但是为了后面能够验证,所以这里还是实现一下。如下:
	// 假定 f() 是一个函数,保证 [1, 5] 范围内等概率返回一个整数
    private int f(){
        return (int)(Math.random() * 5) + 1;
    }

构造 0 1 发生器函数 f2()


  • 这里可以由函数 f() 构造一个 0 1 发生器,保证等概率返回 0 和 1。
	// 由函数 f() 得到 0 1 发生器函数 f2()(等概率返回 0 和 1)
    private int f2(){
        int ran = 0;
        do {
            ran = f();
        }while (ran == 3);
        // 1 or 2 -> 0
        // 4 or 5 -> 1
        return (ran < 3 ? 0 : 1);
    }

将返回 3 的概率均分到返回 1 2 4 5 上即可。这里也不做验证了,同学们可以自己验证下,验证可以参考 【算法学习系列】02。

计算需要几个二进制位


  • 2-10 等概率随机可以转化为 0-8 等概率随机再加上2
  • 0-8 一共有 9 个数,故需要 4 个二进制位。因为 3 个二进制位的最大值是 111(十进制的 7),无法取到 8 这个整数,故需要 4 个二进制位
  • 使用 0 1 发生器等概率随机生成某个 4 位二进制数,并将二进制数大于 8 的概率均分到 0-8 上即可。

代码如下:

	// 实现函数g():[2, 10]等概率返回一个整数的功能
    private int g(){
        // 二进制:0000-1111 十进制:0-15
        int ran = (f2() << 3) + (f2() << 2) + (f2() << 1) + f2();
        // 将大于 8 的数的概率均分到 0-8 上
        while (ran > 8){
            ran = (f2() << 3) + (f2() << 2) + (f2() << 1) + f2();
        }
        // 0-8 -> 2-10
        return (ran + 2);
    }

验证 2-10 等概率返回某个整数


做十万次样本测试,声明一个长度为11的数组,依次保存每个整数出现的次数。如下:

// 验证 2-10 等概率随机
    private void random2To10(){
        int count = 0, testCount = 100000;
        int[] ranCount = new int[11];
        for (int i = 0;i < testCount;i++){
            // g() 返回 2-10 中某个数
            int ran = g();
            ranCount[ran]++;
        }

        // 打印某个数出现的次数
        for (int  i = 0;i < ranCount.length;i++){
            System.out.println(":> " + i + " 出现的次数为:" + ranCount[i]);
        }
    }

验证结果如下:

在这里插入图片描述
可以看到 0 和 1 出现的次数为 0,2-10 中每个数出现的次数都基本认为是一致的,故验证成功。

总结


所以根据上面的验证,由此可以进一步推导出存在:[a, b]等概率随机,实现:[c, d]等概率随机的解决方案。


技术永不眠!下期有缘再见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/540805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

栈与队列的性质互换

本期内容&#xff1a;栈&#xff0c;队列的定义性质&#xff0c;性质转换 栈&#xff0c;队列的定义性质&#xff0c;性质转换 认识栈实现栈 队列实现 性质转换 认识栈 栈&#xff08;stack&#xff09;又名堆栈&#xff0c;它是一种运算受限的线性表。限定仅在表尾进行插入和…

【渗透测试】web日志、linux命令、常用知识

文章目录 web日志分析基础知识1. 编码2. 解码工具3. 数据提交方式4. 常见脚本语言5. 日志还原 分析日志1. 分析日志的目的2. 攻击出现的位置3. 攻击常见的语句4. 攻击常见的特点5. 攻击日志分析流程 相关linux命令常用命令系统状态检测命令工作目录切换命令文本文件编辑命令文件…

BlueZ自动连接蓝牙耳机

问题&#xff1a;调好蓝牙之后&#xff0c;出现了一个客户问题&#xff0c;第一次连接好之后&#xff0c;开关机后没法自动连了。 解决方法&#xff1a; 针对这个情况&#xff0c;实际定位一下问题原因&#xff0c;原来是蓝牙耳机每次连时&#xff0c;都要求授权服务: Author…

sqlmap

1、Sqlmap简介&#xff1a; Sqlmap是一个开源的渗透测试工具&#xff0c;可以用来自动化的检测&#xff0c;利用SQL注入漏洞&#xff0c;获取数据库服务器的权限。它具有功能强大的检测引擎&#xff0c;针对各种不同类型数据库的渗透测试的功能选项&#xff0c;包括获取数据库…

Maven安装和配置(详细版)

Maven安装和配置 Maven安装1、安装链接&#xff1a;2、配置环境变量&#xff1a; Maven配置1、修改Maven仓库下载镜像及修改仓库位置&#xff1a;2、在Idea上配置Maven&#xff1a; 测试Maven安装能否安装jar包 Maven安装 1、安装链接&#xff1a; Maven – Download Apache …

使用A100 GPU搭建OBBDetection的运行环境

项目场景&#xff1a; 最近需要复现一篇目标检测论文的代码&#xff0c;文章提供了代码&#xff0c;因此自己根据仓库的说明尝试配置环境运行代码&#xff0c;但遇到了非常多的困难 问题描述 比较老的代码加上比较的GPU&#xff0c;导致了环境在配置的时候困难重重 OBBDetect…

xorm多表连接查询

SQL的连接查询可以将多个表的数据查询出来&#xff0c;形成一个中间表。在sql中为JOIN关键字。最常用的是LEFT JOIN,RIGHT JOIN,INNER JOIN,OUTER JOIN。 xorm框架是基于go语言的orm框架同样支持连接查询&#xff0c;由于xom及支持原生的sql查询也支持基于xorm的方法查询&…

openEuler用户软件仓(EUR)| 近期项目介绍

在操作系统的世界&#xff0c;软件包是一等公民&#xff0c;软件包的丰富程度和是否易于分发&#xff0c;一定程度上决定了操作系统用户和开发者的使用体验.。 EUR(openEuler User Repo)是openEuler社区针对开发者推出的个人软件包托管平台&#xff0c;目的在于为开发者提供一个…

【LeetCode训练营】用栈来实现队列+用队列来实现栈 详解

&#x1f4af; 博客内容&#xff1a;【LeetCode训练营】用栈来实现队列用队列来实现栈 详解 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; …

Requests-翻页请求实现

翻页请求实现 继https://blog.csdn.net/ssslq/article/details/130747686之后&#xff0c;本篇详述在获取了页面第一页之后&#xff0c;如何获取剩余页的标题内容。 网页&#xff1a;https://books.toscrape.com 找规律 同样还是进行页面的检查&#xff0c;切到网络一栏&…

MySQL查询——joininunion

MySql多表查询的几种方法 连接查询——join自连接查询子查询——&#x1f6e0;in合并查询——Union 认识MySQL数据库的多表查询&#xff0c;在对大量数据进行查询时仅仅使用一些基本的SQL语句已经无法满足我们日益增长的需求&#xff0c;如果要对多表进行查询就不得不认识以下几…

【计算机网络基础】测试2 物理层

文章目录 判断题选择题辨析题应用题 判断题 现在的无线局域网常用的频段是2.8GHz和5.4GHz。 多模光纤只适合于近距离传输。√ 数据在计算机内部多采用串行传输方式&#xff0c;但在通信线路上多采用并行传输方式。 统计时分复用可以按需动态分配时隙。√ 相对于同步时分复用…

安装Ubuntu系统

## ubuntu 22.04 环境处理&#xff08;按顺序安装&#xff09; 1. 搜索并打开“windows 功能”窗口 勾上图示的2项&#xff0c;点确定安装&#xff0c;可能要求重启电脑 2. windows store 中 安装ubuntu 22.04 wsl 一定要登录Microsoft Store 账号再操作 3.在ubuntu安装node.j…

以SpringMVC入门案例分析服务器初始化过程、单次请求流程

文章目录 1&#xff0c;SpringMVC概述2&#xff0c;SpringMVC入门案例2.1 需求分析2.2 案例制作步骤1:创建Maven项目步骤2:补全目录结构步骤3:导入jar包步骤4:创建配置类步骤5:创建Controller类步骤6:使用配置类替换web.xml步骤7:配置Tomcat环境步骤8:启动运行项目步骤9:浏览器…

RabbitMQ --- 死信交换机(一)

前言 当我们在使用消息队列时&#xff0c;难免会遇到一些消息被拒绝&#xff0c;重复投递或者超时等异常情况。这些异常消息如果不被正确处理&#xff0c;将会阻碍整个消息系统的正常运行。而此时&#xff0c;死信交换机&#xff08;Dead Letter Exchange&#xff0c;简称DLX&…

【遇到dfs问题,点进来看看思路】【dfs本质之一 全排列思想解决大部分dfs】例题1.全排列 例题2.单词接龙

总之就是 在已知格线上&#xff0c;填充可用数据&#xff0c; 如果回退到A&#xff0c;那么把A之前所用数据&#xff0c;换一个&#xff0c;并且A之后的数据都重新填写 这就是全排列&#xff08;截取的最关键部分&#xff0c;往下看&#xff09; 这样的话&#xff0c;就是dfs的…

【节点边际电价】机组运行约束对机组节点边际电价的影响分析(Matlab代码实现)​

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

2023年美国大学生数学建模竞赛F题绿色GDP解题全过程文档及程序

2023年美国大学生数学建模竞赛 F题 绿色GDP 原题再现&#xff1a; 背景   国内生产总值(GDP)可以说是衡量-一个国家经济健康状况的最知名和最常用的指标之一。它通常被用于确定一个国家的购买力和获得贷款的机会&#xff0c;为国家提出促进其gdp的政策和项目提供动力。GDP衡…

Springboot +Flowable,流程表单应用之外置表单(HTML形式)(一)

一.简介 整体上来说&#xff0c;我们可以将Flowable 的表单分为三种不同的类型&#xff1a; 动态表单 这种表单定义方式我们可以配置表单中每一个字段的可读性、可写性、是否必填等信息&#xff0c;不过不能定义完整的表单页面。外置表单 外置表单我们只需要定义一下表单的 k…

国考省考行测:求基期量,去年的量,增长率r小于6%化除为乘,否则直接相除

国考省考行测&#xff1a;求基期量&#xff0c;去年的量 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&#xff0c;而常规国考省考最重要的还是申论和行测&#xff0c;所以大家认真准备吧&#xff0c;我讲一起屡屡申论和…