java算法之Math.random()随机概率玩法实例演示
作者:橙子的随笔集 发布时间:2023-11-28 23:32:17
引言
java中的Math.random()是一个在[0,1)范围等概率返回double数值类型的算法,基于此函数,我们来延申一些随机概率算法的变形思路,便于大家对Math.random()函数的随机概率理解
1、Math.random()的说明
Math.random()返回的数据范围是[0,1)
Math.random()数据是等概率返回
Math.random()返回的数据类型是double
我们可以通过类型转换来实现整数型的等概率问题,例如:(int)Math.random()
2、Math.random()的等概率代码验证
测试Math.random()函数的等概率,Math.random()在[0,1)等概率返回double类型的数据,X出现的次数除以总测数来测试是否等概率
代码演示
public class Random{
public static void main(String[] args) {
math();
}
/**
* @Author wangchengzhi
* @Description
* 测试Math.random()函数的等概率
* Math.random()在[0,1)等概率返回double类型的数据
*出现的次数除以总测数来测试是否等概率
* @Date 14:31 2022/12/16
* @Param
* @return
**/
public static void math(){
int testTime=100000000;
int count =0;
double= 0.5;
for(int i=0;i<testTime;i++){
if(Math.random()<p){
count++;
}
}
System.out.println("Math.random()为[0,1)的等概率函数,小于"+p+"出现的概率是"+p);
System.out.println((double)count/(double)testTime);
}
}
3、Math.random()*N的变形
测试Math.random()*N函数的等概率,Math.random()得等概率范围为[0,1),Math.random()*N等概率返回得范围为[0,N),这里以N=10为例来测试.
代码演示
public class Random{
public static void main(String[] args) {
math1();
}
/**
* @Author wangchengzhi
* @Description
* 测试Math.random()*N函数的等概率
* Math.random()得等概率范围为[0,1)
*Math.random()*N等概率返回得范围为[0,N)
* 这里以N=10为例来测试
* @Date 14:31 2022/12/16
* @Param
* @return
**/
public static void math1(){
int testTime=100000000;
int count =0;
int p=10;
for(int i=0;i<testTime;i++){
if(Math.random()*p<5){
count++;
}
}
System.out.println("Math.random()*10为[0,10)的等概率函数,小于5得数出现得概率是0.5");
System.out.println((double)count/(double)testTime);
}
}
4、Math.random()转换对应整数概率的变形
测试Math.random()*N整数的等概率返回,Math.random()*N等概率返回得范围为[0,N)(int)(Math.random()*N)等概率返回得范围为[0,N-1]的整数出现的概率,这里以N=9为例来测试
代码演示
public class Random{
public static void main(String [] args){
math2();
}
/**
* @Author wangchengzhi
* @Description
* 测试Math.random()*N整数的等概率返回
*Math.random()*N等概率返回得范围为[0,N)
* (int)(Math.random()*N)等概率返回得范围为[0,N-1]的整数出现的概率
* 这里以N=9为例来测试
* @Date 14:31 2022/12/16
* @Param
* @return
**/
public static void math2(){
int testTime=100000000;
int m=9;
int [] count = new int[m];
for(int i=0;i<testTime;i++){
int res=(int)(Math.random()*m);
count[res]++;
}
for(int i=0;i<m;i++){
System.out.println("在这次测试中,数字"+i+"返回的次数为"+count[i]);
}
}
}
5、Math.random()返回概率转变的变形
随机返回[0,1)范围的数X ,且0~X出现的概率是X的平方 ,x出现的概率是X ,所以Math.max(Math.random(),Math.random())最大值,是两次都出现x的概率 ,就是x乘以x为x的平方
代码演示
public class Random{
public static void main(String [] args){
math3();
}
/**
* @Author wangchengzhi
* @Description
* 目标:
* 随机返回[0,1)范围的数X
* 且0~X出现的概率是X的平方
* 分析:
* x出现的概率是X
* 所以Math.max(Math.random(),Math.random())最大值,是两次都出现x的概率
* 就是x乘以x,x的平方
* @Date 14:31 2022/12/16
* @Param
* @return
**/
public static void math3(){
int testTime=100000000;
int count =0;
double k =0.8;
for(int i=0;i<testTime;i++){
if(Math.max(Math.random(),Math.random())<k){
count++;
}
}
System.out.println("k出现的概率"+(double)count/(double)testTime);
System.out.println("k的平方是"+Math.pow(k,2));
}
}
结言:
Math.Random()函数是一个特殊使用的等概率函数,我们在设计一些算法的时候,可以巧妙的对该函数进行变形,以满足我们的具体业务场景,以上的例子希望能对大家拓展思路起到一些引导作用,后面会再给大家分享一些针对该函数的变形案例。
来源:https://blog.csdn.net/weixin_48583915/article/details/128343858


猜你喜欢
- 引言在Google I/O 2014上,Google公布了Android L Preview版本,此版本的UI有了非常大的改变,很炫很给力!
- 废话不多说了,直接给大家贴代码了,具体代码如下所示:html代码如下:<body><input id="file
- Android 是一款基于 Linux 内核,面向移动终端的操作系统。为适应其作为移动平台操作系统的特殊需要,谷歌对其做了特别的设计与优化,
- 一、封装一个工具类1、简易版package net.aexit.construct.acceptance.websky.utils;impo
- 简介相信大家有配置过多数据源,或者即将配置多数据的朋友们,会发现网上大概有以下几种方案:1. 使用 AOP 切片进行动态数据源切换2. 使用
- class文件中的fields_count和fieldsfields_count描述的是当前的类中定义的字段的个数,注意,这里包括静态字段,
- Java与Scala创建List与Map//JavaList<String> languages = new ArrayList
- 官方文档:https://central.sonatype.org/publish/publish-maven/#a-complete-ex
- 数据库事务是被当作单个工作单元的操作序列。这些操作要么全部完成或全部不成功。事务管理是面向企业应用程序,以确保数据的完整性和一致性RDBMS
- 本文实例为大家分享了Java编写实现九宫格应用的具体代码,供大家参考,具体内容如下在九宫格里面轮流画圈或叉,哪一方先在水平、竖直、或对角线上
- 前言有时候我们在项目中,会用到一些本地 jar 包文件,比如隔壁公司自己打包的;此时无法从maven远程仓库拉取;那么我们可以考虑把 jar
- 以前的Java项目中充斥了太多不友好的代码:POJO的Getter/Setter/toString等等,这些代码由于没有什么技术含量,影响了
- 先介绍一下API,与其他文章不同的是,本文采取类比的方式来讲,同时结合源码。而不像其他文章一样,一个个API罗列出来,让人找不到重点。1、O
- 详解java中的PropertyChangeSupport与PropertyChangeListenerjava中的PropertyChan
- 上一篇介绍了使用springmvc集成shiro登陆过程,通过FormAuthenticationFilter过滤器获取到用户输入的账号密码
- 本文实例讲述了Android仿微信语音聊天功能代码。分享给大家供大家参考。具体如下:项目效果如下:具体代码如下:AudioManager.j
- 阻塞、无饥饿、无障碍、无锁、无等待几种。阻塞一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执行。当我们使用synchroni
- 一、ObjectContext对象上下文Entity SQL 语言 - ADO.NET | Microsoft 官当文档ObjectCont
- 1、简介单例模式使⽤场景:业务系统全局只需要⼀个对象实例,⽐如发号器、 redis 连接对象等。Spring IOC容器中的 Bean 默认
- SpringBoot启动类静态资源路径SpringBoot核心配置类SpringBoot核心JAR包--》spring-boot-autoc