【算法学习系列】02 - 你真的有好好使用过 Math.random() 函数吗?

news2024/11/23 19:04:19

文章目录

  • 说明
  • 验证函数等概率返回功能
  • 验证 [0, 8)上也是等概率返回一个数的功能
  • 验证等概率返回[0, K - 1]中的一个整数
  • 实现:任意x,x属于[0, 1),[0, x)范围上的数出现概率由原来的x调整成x平方

说明


获取随机数大家应该都有用到过 Math.random() 这个函数,下面来看看源码的注释。

/**
     * Returns a {@code double} value with a positive sign, greater
     * than or equal to {@code 0.0} and less than {@code 1.0}.
     * Returned values are chosen pseudorandomly with (approximately)
     * uniform distribution from that range.
     *
     * <p>When this method is first called, it creates a single new
     * pseudorandom-number generator, exactly as if by the expression
     *
     * <blockquote>{@code new java.util.Random()}</blockquote>
     *
     * This new pseudorandom-number generator is used thereafter for
     * all calls to this method and is used nowhere else.
     *
     * <p>This method is properly synchronized to allow correct use by
     * more than one thread. However, if many threads need to generate
     * pseudorandom numbers at a great rate, it may reduce contention
     * for each thread to have its own pseudorandom-number generator.
     *
     * @return  a pseudorandom {@code double} greater than or equal
     * to {@code 0.0} and less than {@code 1.0}.
     * @see Random#nextDouble()
     */
    public static double random() {
        return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble();
    }

主要就是第一段注释说明如下:

返回 [0, 1) 之间的 double 类型的一个浮点数。
返回的值是以(近似)均匀分布的方式从该范围内伪随机选择的。

  • 说实话,能做到等概率返回一个数,实际中是比较难做到的,但是在计算机中还是有办法做到的。所以厉害就厉害在这个 等概率返回某个数

验证函数等概率返回功能


  • 验证代码比较简单,如下:
		// 验证 random 函数的等概率返回功能
        int count = 0,testCount = 100000;
        for (int i  = 0;i < testCount;i++){
            if (Math.random() < 0.6){
                count++;
            }
        }
        System.out.println(":> count=" + count + ", 占比 " + (double)count / (double)testCount);

这里做了十万次获取随机数的操作。

如果每次返回的数小于 0.6 ,那么对变量 count 进行加 1 统计,循环十万次后最后得到 count 的值,然后用 count 除以总测试次数,得到实际占比。

如果实际占比也是 0.6 或者是无限接近 0.6 就说明验证函数等概率返回是成功的。

  • 结果如下:

在这里插入图片描述

实际占比无限接近 0.6,故验证成功。

验证 [0, 8)上也是等概率返回一个数的功能


Math.random() * 8 后,是不是也是等概率返回 [0, 8) 中的一个浮点数,我们来继续验证。

  • 验证代码如下:
		// 验证 [0, 8)上也是等概率返回一个数的功能
		int count = 0,testCount = 100000;
		for (int i = 0;i < testCount;i++){
            // 预期占比应该是 4/8
            if (Math.random() * 8 < 4){
                count++;
            }
        }
System.out.println(":> count=" + count + ", 占比 " + (double)count / (double)testCount);

这里也是进行十万次获取随机数操作。

每次获取的随机数乘以整数 8 ,如果该值小于 4 ,就对变量 count 进行加 1 统计,循环十万次后得到最终 count 的值,用该值除以总测试次数得到实际占比,如果跟预期占比 4/8 相同或者无限接近预期占比 4/8,就说明验证成功。

  • 结果如下:

在这里插入图片描述

可以看到,实际占比很接近预期占比 4/8 ,故验证成功。

验证等概率返回[0, K - 1]中的一个整数


这里假定 K 是一个大于 2 的整数。

我们具体化一个例子进行验证。假设 K = 10,那么就是验证 Math.random() * 10 是不是等概率返回 [0, K - 1]中的一个整数。

  • 验证代码如下:
		int count = 0,testCount = 100000;
		// 验证等概率返回[0, K - 1]中的一个整数
		int K = 10;
		int[] countK = new int[K];// countK[0] = 0出现的次数、countK[1] = 1出现的次数
		for (int i = 0;i < testCount;i++){
            int ranK = (int)(Math.random() * K);
            countK[ranK]++;
        }

		for (int i = 0;i < K;i++){
            System.out.println(":> " + i + " 出现的次数: " + countK[i]);
        }

进行十万次获取随机数操作。

创建一个整型数组 countK 保存每个整数(从 0 到 9)出现的次数。每次获取的随机数乘以 10,给该值取 int 整型,看得到的整数 ranK 是多少,就给 countK[ranK] 进行加 1 操作。

当循环十万次操作后,得到的 countK 数组中各个元素的值就是从 0 到 9 各个整数出现的次数。

如果 countK 数组中每个元素的值都无限接近或者相等,就说验证成功。

  • 结果如下:
    在这里插入图片描述
    可以看到 10 以内的每个整数出现的次数可以认为基本相同,故验证成功。

实现:任意x,x属于[0, 1),[0, x)范围上的数出现概率由原来的x调整成x平方


由上面几个验证可知,随机函数Math.random()返回的某个数 x,x ∈ [0, 1),并且因为 x 是等概率返回的某个数,所以随机函数返回 [0, x)范围上的数出现的概率是 x。

验证代码如下:

		int count = 0,testCount = 100000;
		double x = 0.6;

		private double xPow2(){
        	// 注意这里取两个随机数中的最大值
        	return Math.max(Math.random(), Math.random());
    	}

		// 实现:任意x,x属于[0, 1),[0, x)范围上的数出现概率由原来的x调整成x平方
        count = 0;
        double x = 0.6;
        Math.max(Math.random(), Math.random());
        for (int i = 0;i < testCount;i++){
            if (xPow2() < x){
                count++;
            }
        }
        System.out.println(":> 预期占比 " + Math.pow(x, 2));
        System.out.println(":> 实际占比 " + (double)count / (double)testCount);

这里还是进行十万次样本测试。

x 假设为 0.6 ,那么取一次随机数返回值小于 0.6 的概率就是 0.6,所以这里需要取两次随机数并进行乘法。

要保证两次的 0.6 概率进行相乘,就需要保证两次获取随机数中较大的值也小于 0.6,才能满足题干条件。

  • 验证结果如下:

在这里插入图片描述
可以看到十万次样本数据测试出来的实际占比跟预期占比 0.36 基本是一致的,故验证成功。
(当然同学们自己可以多测试几次,我这里就不验证了)

Ans:所以可以依次类推,如果需要实现:任意 x,x 属于 [0, 1),[0, x) 范围上的数出现概率由原来的 x 调整成 x 的 n 次方?
Qes:只需要求取 n 次随机函数操作,两两依次取最大值即可。


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

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

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

相关文章

PMP课堂模拟题目及解析(第10期)

91. 在项目执行阶段&#xff0c;一名项目干系人要求项目经理加入一个新过程的优化。项目经理应该怎么做&#xff1f; A. 执行实施整体变更控制过程。 B. 与过程专家一起审查项目。 C. 将优化项目分配给团队。 D. 拒绝范围蔓延企图。 92. 项目经理要求团队提供对项目应急计…

【LeetCode】415. 字符串相加

415. 字符串相加&#xff08;简单&#xff09; 方法一 思路 这道题很简单&#xff0c;我们知道&#xff0c;如果对两个数相加&#xff0c;那么需要对位相加&#xff0c;为了方便对位&#xff0c;我们可以对长度较小的字符串前面补 0&#xff0c;使得 num1 和 num2 长度相等。…

美团Java开发一面凉经

目录 1.HashMap底层数据结构2.列举几个常见的线程安全容器3.HashMap线程问题4.concurrentHashMap5.ConcurrentModificationException6.Spring AOP、IOC、DI介绍下7.不使用依赖注入&#xff0c;使用传统方式的声明会有什么问题8.最左前缀原则9.TCP三次握手、四次挥手 1.HashMap底…

EasyExcel读取EXcel文件内容

目录 一 官方文档介绍 二 读取文件内容 1.根据文档内容建立读对象 2.创建读监听器 3.测试类代码 一 官方文档介绍 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决…

(二十三)数据结构-哈希表

1 哈希表的基本介绍 1.1 用于存储的数据结构 在计算机中&#xff0c;数组和链表都可以用于数据的存储&#xff0c;既然有数据存储&#xff0c;那么必然要有数据的查询&#xff0c;因此我们在将数据存储进数组和链表中之后&#xff0c;必然要对它们进行查询操作。一个链表的查…

java+springboot+jsp农产品商城农场信息化系统多用户

系统功能包括前台&#xff1a;首页、商品信息、新闻资讯、我的、跳转到后台、购物车&#xff0c;管理员&#xff1a;个人中心、用户管理、员工管理、技术专家管理、部门信息管理、资金统计管理、农资信息管理、商品分类管理、商品信息管理、入库记录管理、出库记录管理、销售统…

如何调用api接口获取其中的数据

part1.API接口可以运用到的场景&#xff0c;主要包括以下几个方面&#xff1a; 1. 应用程序集成&#xff1a;API可以使不同的应用程序相互之间进行集成&#xff0c;比如将某个应用程序的数据传递给另一个应用程序&#xff0c;或者调用另一个应用程序的功能。 2. 数据共享&#…

cocos2dx游戏项目,集成到其他安卓项目工程之中!

背景 公司&#xff0c;想优化掉&#xff0c;在app中&#xff0c;以webview方式&#xff0c;加载游戏的方式。以安卓项目为例&#xff0c;改成&#xff1a;游戏项目导出安卓工程&#xff0c;可直接使用的aar资源。 第一步&#xff1a;cocos项目&#xff0c;构建安卓工程 安装…

icmp协议

1、icmp协议 2、工具之ping -c (设置ping的次数&#xff0c;默认无限次&#xff0c;可选) -i (设置ping的时间间隔&#xff0c;默认1秒&#xff0c;可选) -W (设置ping的超时时间&#xff0c;单位秒&#xff0c;可选) ping -c 3 -i 0.1 -W 0.1 www.baidu.com-i 自定义时间间…

接口自动化框架对比 | 质量工程

一、前言 自动化测试是把将手工驱动的测试行为转化为机器自动执行&#xff0c;通常操作是在某一框架下进行代码编写&#xff0c;实现用例自动发现与执行&#xff0c;托管在CI/CD平台上&#xff0c;通过条件触发或手工触发&#xff0c;进行回归测试&线上监控&#xff0c;代替…

opencv-python相机标定详解

文章目录 角点检测查看角点标定 opencv中内置了张正友的棋盘格标定法&#xff0c;通过一些姿态各异的棋盘格图像&#xff0c;就能标定相机的内外参数。 角点检测 第一步是角点检测&#xff0c;首先需要读取棋盘格图像 import numpy as np import cv2 import ospath imgs #…

一种Android应用的桌面图标隐藏方法

在Android10之前&#xff0c;应用程序通过调用PackageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP)函数来实现图标隐藏。 但是在android10之后&#xff0c;所有带四大组件&#xff08…

RabbitMQ养成记 (6. spingboot 集成 rabbitMQ,生产者/消费者)

Springboot集成 搞springboot的那群人 不喜欢造轮子&#xff0c;就喜欢搞各种集成。 首先创建一个springboot项目&#xff1a; 之前我们在方法中 创建工厂类配置&#xff0c; 现在直接在application.yml 中配置即可&#xff1a; spring:rabbitmq:host: **********username:…

赢得浮生半日闲,内卷时代,我们需要怎样的智能科技?

哲学家罗泰戈拉说&#xff1a;“人是万物的尺度&#xff0c;是存在的事物存在的尺度。” 智能电器&#xff0c;究竟能为用户和市场提供什么样的价值&#xff1f;凭什么让消费者买单&#xff1f;毫无疑问&#xff0c;也应该以“人”为标尺。 今天&#xff0c;忙碌似乎成了现代人…

特征选择与特征提取

目录 一、 特征选择1、特征2、特征选择3、扩展——特征选择算法(有兴趣和精力可了解)拓展--完全搜索:拓展--启发式搜索:拓展--随机搜索:拓展--遗传算法: 二、 特征提取三、特征提取主要方法——PCA(主成分分析)1、PCA算法是如何实现的&#xff1f;PCA--零均值化&#xff08;中心…

Redis 概述

1. NoSQL 数据库简介 技术发展: 技术的分类 1、解决功能性的问题&#xff1a; Java、 Jsp、 RDBMS、 Tomcat、 HTML、 Linux、 JDBC、 SVN2、解决扩展性的问题&#xff1a; Struts、 Spring、 SpringMVC、 Hibernate、 Mybatis3、解决性能的问题&#xff1a; NoSQL、 Java 线…

从神经递质到网络:利用分子信息功能成像超越组织层级

导读 人脑在微观、介观和宏观尺度的组织原则上表现出复杂的相互作用。最近的协同多模态方法已经开始将微观尺度信息与系统水平的动力学联系起来&#xff0c;超越了组织层级&#xff0c;并为大脑的功能和功能障碍提供了新的视角。具体来说&#xff0c;可以将微观尺度特性&#…

HMI 自动生成技术讨论(1)

HMI 的信息模型 HMI 给人的基本印象就是一个设备控制面板&#xff0c;或者是控制室里电脑屏幕的图形控制界面。进入信息化时代&#xff0c;HMI 的需求越来越大&#xff0c;不仅仅是操作工人和运维人员需要HMI&#xff0c;集团公司&#xff0c;工厂&#xff0c;车间的管理人员&…

芯片封装技术(四)

集成电路芯片与封装之间是不可分割的整体。没有一个芯片可以不用封装就能正常工作&#xff0c;封装对芯片来说是必不可少的&#xff0c;随着IC生产技术的进步&#xff0c;封装技术也不断更新换代&#xff0c;每一代IC都与新一代的IC封装技术紧密相连。 一、什么是封装&#xf…

Qt文件系统源码分析—第二篇QFileInfo

深度 本文主要分析Windows平台&#xff0c;Mac、Linux暂不涉及 本文只分析到Win32 API/Windows Com组件/STL库函数层次&#xff0c;再下层代码不做探究 本文QT版本5.15.2 类关系图 QTemporaryFile继承QFile QFile、QSaveFile继承QFileDevice QFileDevice继承QIODevice Q…