算法 | 如何通过Math.random()方法实现X平方或更多次方的概率?

news2024/12/23 19:34:08

前言

本文主要介绍JavaMath.random()方法以及该方法的简单应用。

每种语言都有随机方法,在Java中的随机方法有Math.random()方法、Random类。

Math.random

Math.random()方法的返回值的是double类型,其返回值的范围为[0,1),包含0,不包含1,会把0 ~ 1之间的数进行等概率返回。

等概率验证

所说是等概率返回其中的某一个数,那我们能不能验证一下?

验证思路:

  1. 设置一个循环,循环1千万次。
  2. 定义一个变量count,用来记录这1千万次中,小于0.4的个数。
  3. 在循环里判断如果返回值小于0.4,则count值加1。
  4. count比上1千万,如果得出的值在0.4左右,说明是等概率的。

当然这个循环次数和0.4也可以是其他值。

来看下代码实现:

public class Code09_Random {

    public static void main(String[] args) {
        int times = 10000000;
        int count = 0;
        for (int i = 0; i < times; i++) {
            if (Math.random() < 0.4) {
                count++;
            }
        }

        System.out.println((double) count / (double) times);
    }
}
复制代码

经过多次执行验证结果如下:

当比较的数为0.4时,输出结果为0.40015690.39983260.3999383

当比较的数为0.68时,输出结果为0.67999990.68003830.6800142

当比较的数为0.8时,输出结果为0.79993520.8000830.7999917

等等,经过多次验证,发现比较值和输出的结果是非常接近的,这说明Math.random()是等概率返回的。

扩大范围

Math.random()返回值的范围为[0,1),如果把Math.random()返回值乘以5,即Math.random() * 5,那么就可以得到[0,5)这个范围的数据,并且是等概率的,等概率验证方式与之前相同,不再赘述。

同样的,想要返回[0,K)之间的数,只需要乘以K即可,Math.random() * K,如果把得到的数据强转成int型,就可以得到[0,K-1]等概率数据。

Math.random()实现X2的概率

解析

Math.random()返回值的范围为[0,1)并且是等概率的,那么[0,X)上的数有X个,那么如果实现[0,X)范围的数据返回的概率为 X2 呢?

我们知道,在数学上,X和X2分别对应线性和曲线,对于X来说,[0, 0.3]出现的概率为0.3,[0, 0.8]出现的概率为0.8,[0, 1)出现的概率为1。

对于X2来说,X越小他对应的的概率越低,但是最终[0, 1)这个范围的概率是1。

代码实现

要实现这个功能,其实也很简单,调用两次Math.random()获取其最大值就可以了。

public static double x2Probability() {
    return Math.max(Math.random(), Math.random());
}
复制代码

嗯?是不是感觉很不可思议。下面我们来验证一下。

概率验证

验证思路也很简单,跟上面一样,定义一个count来记录一下,最后获取比例。怎么知道这个比例对不对呢?我们再获取目标概率的平方来对比下,如果两个值很接近的话,说明是对的。

public class Code10_Random {

    public static void main(String[] args) {
        int times = 10000000;
        int count = 0;
        double target = 0.4;
        for (int i = 0; i < times; i++) {
            if (x2Probability() < target) {
                count++;
            }
        }
        System.out.println((double) count / (double) times);
        System.out.println(Math.pow(target, 2));
    }

    public static double x2Probability() {
        return Math.max(Math.random(), Math.random());
    }
}
复制代码

多次执行结果如下:

# 0.4 对应的结果
0.1599787
0.16000000000000003
复制代码
# 0.8 对应的结果
0.6397657
0.6400000000000001
复制代码

实际测试的结果真的和X2的平方差不多。

原理解析

首先范围为[0,X)x2Probability方法调用了2次Math.random()方法,并获取最大值,如果这个最大值落在[0,X)范围内,说明两次random产生的随机数,都落在了[0,X)范围内,概率自然是X2了。

当第一个Math.random()方法产生的随机数落在[0,X)范围内的概率为X,第二个Math.random()方法产生的随机数落在[0,X)范围内的概率也为X,两次随机事件是独立的,所以总概率为X2。

拓展

如果是想通过Math.random()实现X3的概率呢?和上面的原理是一样的,执行3次Math.random()方法即可,代码如下,验证方法和上面一致,就不再进行验证了。

public static double x3Probability() {
    return Math.max(Math.random(), Math.max(Math.random(), Math.random()));
}
复制代码

如果是想通过Math.random()实现XK的概率呢?同理,我们只需要调用KMath.random()方法即可。

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

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

相关文章

每日笔记

下周要做一个hmi获取登录码、小程序码的新接口&#xff0c;需要用到新的知识来实现这个功能 接口英文名 getUnlimitedQRCode 功能描述 该接口用于获取小程序码&#xff0c;适用于需要的码数量极多的业务场景。通过该接口生成的小程序码&#xff0c;永久有效&#xff0c;数量…

Es客户端学习

版本&#xff1a;opensearch-rest-high-level-client-2.3.0.jar&#xff0c;httpcore-nio-4.4.11.jar&#xff0c;httpasyncclient-4.1.4.jar 问题背景 初始化es索引逻辑是监听大数据团队消息&#xff0c;然后异步写入es(org.opensearch.client.RestHighLevelClient#bulkAsyn…

七、Kubernetes1.25应用部署、发布的两种方式

1、概述 通过现代的 Web 服务&#xff0c;用户希望应用程序能够 24/7 全天候使用&#xff0c;开发人员希望每天可以多次发布部署新版本的应用程序。 容器化可以帮助软件包达成这些目标&#xff0c;使应用程序能够以简单快速的方式发布和更新&#xff0c;而无需停机。这段话是Ku…

智子商城项目实践开发文档

ZutShop Junior practical training project 在csdn暂存一下开发文档 本人大三做的实训项目&#xff0c;前后端分离。 后端&#xff1a;https://github.com/roydonGuo/ZutShop 前端使用Vue&#xff0c;前端项目地址&#xff1a;https://github.com/roydonGuo/ZutShop-Vue 0. …

python利用json和pyecharts画折线图实例

目录 一.json模块对数据进行处理 二.利用pyecharts画折线图 三.利用pyecharts画美、日、印三国家折线图 四.本文数据集 注&#xff1a;本次实验的数据在文章最后面&#xff0c;我已上传至百度网盘 一.json模块对数据进行处理 上面三个txt文本是这三个国家疫情爆发相关的数据 …

linux有磁盘空间却显示不足 linux中inode使用率过高处理办法

linux中inode使用率过高处理办法 前几天收到监控告警&#xff0c;说Inode节点空间不足&#xff0c;之前没处理过这种问题&#xff0c;所以记录一下处理过程&#xff0c;便于以后查阅。 Inode使用率高并不会影响系统正常运行和新文件的创建&#xff0c;但是当使用率达到100%的…

【Linux】Linux编译器gcc/g++的使用

今天不学习&#xff0c;明天变垃圾。 文章目录一、程序的翻译过程1.预处理&#xff08;1.2.3把你的代码编译成二进制代码&#xff09;2.编译&#xff08;C语言 > 汇编语言&#xff09;3.汇编&#xff08;无法被执行的二进制文件&#xff0c;为什么捏&#xff1f;&#xff09…

腾讯云Windows 轻量应用服务器如何搭建 FTP 服务?

本文档介绍如何在 Windows 操作系统的轻量应用服务器上通过 IIS 搭建 FTP 站点。 本文搭建 FTP 服务组成版本如下&#xff1a; Windows 操作系统&#xff0c;本文以系统镜像 Windows Server 2012 为例。IIS&#xff1a;Web 服务器&#xff0c;本文以 IIS 8.5 为例。 步骤1&am…

自行车在线租赁管理系统的设计与实现

自行车在线租赁管理系统 摘 要 随着Internet的不断发展&#xff0c;在线租赁在现实生活中的使用和普及&#xff0c;自行车在线租赁行业成为近年内出现的一个新行业&#xff0c;并且能够成为大众广为认可和接受的行为和选择。设计自行车在线租赁管理系统的目的就是借助计算机…

(四)汇编语言——简单程序

目录 编写程序的工作过程 编写汇编源程序 伪指令 汇编指令 注释 编写步骤 编译连接 编译 连接 运行 总结 编写程序的工作过程 接下来&#xff0c;我们简单介绍一下一个汇编程序&#xff0c;从写出到最后执行&#xff0c;他到底经历了哪些步骤。 编写汇编源程序 首先…

vue3 antd项目实战——修改table表格的默认样式(一)调整table表格每行(row)行高过高问题

vue3 antd项目实战——修改ant design vue table组件的默认样式&#xff08;调整每行行高&#xff09;知识调用场景复现实际操作解决a-table表格padding过宽知识调用 文章中可能会用到的知识链接vue3ant design vuets实战【ant-design-vue组件库引入】css样式穿透&#xff08;…

node.js+uni计算机毕设项目基于微信小程序的房屋交易平台(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等…

智能超表面(RIS)辅助双功能雷达和通信波束形成设计(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 智能超表面&#xff0c;也叫做“可重配智能表面”&#xff0c;或者“智能反射表面”&#xff0c;英文为RIS&#xff08;Reconf…

springboot消息

发送短信的简单原理 activemq 5.17 版本的 需要java11 环境 mq 网页版本控制台 账号密码为admin 指定发送的名 即上图的默认名为itheima 监听器 自动监听消息 接受 如果接受到消息 还想再其他地方使用 可以使用sendto 使用管理员权限 登录 然后列出插件 安装插件 r…

Java 注解 自定义注解 注解的解析

目录 一、认识Java自带注解 二、自定义注解 1、认识元注解 2、自定义注解 3、注解的使用 4、反射解析注解 一、认识Java自带注解 jdk中自带了一些注解&#xff0c;如下四个&#xff1a; Override类方法的的重写注解Deprecated类或方法被废除的注解FunctionalInterface函…

数据结构---串

&#xff08;一&#xff09;串的基本概念 串&#xff08;string或字符串&#xff09;是由零个或多个字符组成的有限序列&#xff0c;一般记为&#xff1a;s′a1a2…a′n(n≥0) 其中&#xff0c;s是串的名称&#xff0c;用单括号括起来的字符序列是串的值; ai(1≤i≤n)ai(1≤i…

CSS优先级CSS盒子模型

1、CSS继承 文字相关的样式可以被继承【作用在父元素上面&#xff0c;子元素可以继承】布局相关的样式不可以被继承【可以通过inherit值进行继承】 2、CSS优先级 书写了相同样式时&#xff0c;后写的样式优先级较高当内部样式和外部样式有相同的样式时&#xff0c;后写的样式…

操作符(8)

目录 1、算术操作符 2、移位操作符 3、位操作符 1、不能创建临时变量&#xff08;第三个变量&#xff09;&#xff0c;实现两个数的交换 4、赋值操作符 5、单目操作符 6、关系操作符 7、逻辑操作符 8、条件操作符 9、逗号表达式 10、下标引用、函数调用和结构成员 …

WPF开发之Prism详解【内附源码】

在实际应用开发中&#xff0c;随着项目业务逐渐复杂&#xff0c;耦合度会越来越高&#xff0c;维护成本也会直线上升&#xff0c;所以解耦也变得越来越重要。Prism框架为WPF开发中解耦提供了非常便捷的应用。今天主要以一个简单的小例子&#xff0c;简述WPF开发中Prism框架的简…

基于Arch Linux的SystemRescue 9.06工具包新特性

导读在上次发布两个月后&#xff0c;SystemRescue&#xff08;原名SystemRescueCd&#xff09;Linux系统救援工具包今天更新到了9.06版本&#xff0c;这个版本在启动菜单中增加了新的选项&#xff0c;更新了组件和新工具。 SystemRescue 9.06在这里采用了最新、最棒的Xfce 4.18…