每日算法220503随机数和对数器
Posted 如何在5年薪百万
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日算法220503随机数和对数器相关的知识,希望对你有一定的参考价值。
今日题目
- 随机数的基本使用
- 通过随机数生成对数器
今日心得
- 题目解法想不到很正常,不要新生惭愧。开始对于任何人都很难。就比如你想不到1+1等于2 一样。看似简单的问题,实际有复杂的推导过程。你不必要知道怎来的,但一定要学习1+1=2这个结论用来解决实际问题。
- 练习做到位了,想法自然就有了
一、 Math.random()函数
- 等概率返回 double [0,1)
- int ans=(int)(Math.random()*K); 等概率返回任意整数
- 获取不等概率返回[0,1)概率是x,Max(Math.random,Math.random)的概率是x的平方
package math;
/**
* @ClassName MathRandom
* @Description TODO
* @Author kouryoushine
* @Date 2022/5/3 16:28
* @Version 1.0
*/
public class MathRandom
//math.radom等概率返回double类型数
public static void main(String[] args)
buildInteger();
int testTimes=100000000;
int count=0;
for (int i = 0; i < testTimes; i++)
if(Math.random()<0.78934234)
count++;
System.out.println((double)count/(double)testTimes);
/**
* build integer
*/
public static void buildInteger()
int testTimes=100000000;
int [] counts = new int[9];
int K =9;
for (int i = 0; i < testTimes; i++)
int ans=(int)(Math.random()*K);
counts[ans]++;
//每个数产生的次数是几乎均等的
for (int i = 0; i < counts.length; i++)
System.out.println("i ="+i+" value="+counts[i]);
通过random[1-5]函数获取random[1-7]算法实现
package math;
/**
* @ClassName Rand15ToRand7
* @Description 已知一个随机函数能随机得到1-5,仅利用该函数写一个随机得到1-7的函数
* @Author kouryoushine
* @Date 2022/5/3 17:28
* @Version 1.0
*/
public class Rand15ToRand7
public static void main(String[] args)
//测试
int [] counts=new int[8];
for (int i = 0; i < 10000000; i++)
int ans=rand17();
counts[ans]++;
//结果产生1~7的概率均等
for (int i = 0; i < counts.length; i++)
System.out.println("i="+i+" values= "+counts[i]);
//rand15->rand10->rand07->rand06->rand17 过程比较曲折
public static int rand17()
return rand06()+1;
public static int rand06()
int ans;
do
ans=rand07();
while (ans==7); //产出7的概率会均分到0~6上面
return ans;
public static int rand07()
//我们使用rand10获取2进制的每一位,如果想获取1~7,大概需要3个bit
// rand10,rand10,rand10 三次是独立事件,拼成一次2进制数字概率是乘法法则。
// 即1/2 * 1/2 * 1/2 = 1/8。即等概率获取到[000~111],即10进制的[0,7]
return (rand10()<<2)+(rand10()<<1)+(rand10()<<0);//2进制转10进制
//利用rand15随机返回rand10
//原理:1~5每个区间是等价的,我们选择12和45区间也是等概率的。
public static int rand10()
int ans;
do
ans=rand15();
while (ans==3);
return ans<3?1:0;
//随机返回1~5
public static int rand15()
return (int) (Math.random() * 5) + 1;
不等概率01生成器转换等概率01生成器
package math;
/**
* @ClassName EqualProbabilityRandom
* @Description 不等概率01 转换称为等概率01
* @Author kouryoushine
* @Date 2022/5/3 18:20
* @Version 1.0
*/
public class EqualProbabilityRandom
public static void main(String[] args)
//测试
int[] counts = new int[2];
for (int i = 0; i < 10000000; i++)
int ans = equalProbabalityRand10();
counts[ans]++;
//结果产生1~7的概率均等
for (int i = 0; i < counts.length; i++)
System.out.println("i=" + i + " values= " + counts[i]);
public static int equalProbabalityRand10()
//调用两次unequal函数
// 0,0 概率 P+P
// 1,1 概率 (1-P)+(1-P)
// 1.0 概率 (1-P) + P
// 0,1 概率 p +(1-P)
// 结论:获取后两个概率相等
int ans1;
int ans2;
do
ans1 = unEqualProbabilityRand10();
ans2 = unEqualProbabilityRand10();
while (ans1 == ans2);
return ans1;
//上面的简化写法
public static int equalProbabalityRand102()
int ans;
do
ans = unEqualProbabilityRand10();
while (ans == unEqualProbabilityRand10());
return ans;
//某个不固定概率返回0,1
public static int unEqualProbabilityRand10()
return Math.random() < 0.84 ? 0 : 1;
二、对数器
package math;
/**
* @ClassName Comp
* @Description 对数器,建立测试数据
* 随意控制样本大小验证算法正确性
* @Author kouryoushine
* @Date 2022/5/3 18:41
* @Version 1.0
*/
public class Comp
//返回随机数组
public static int[] randomIntArray(int maxLength, int maxValue)
int len = (int) (Math.random() * maxLength);
int[] arr = new int[len];
for (int i = 0; i < len; i++)
arr[i] = (int) (Math.random() * maxValue);
return arr;
//是否曾旭
public static boolean isSortedByAsc(int[] arr)
if (arr.length < 2)
return true;
for (int i = 1; i < arr.length; i++)
if (arr[i] < arr[i - 1])
return false;
return true;
用来测试写好的sort算法
public static void main(String[] args)
int MaxLength=1000;
int MaxValue=100;
int testTImes=10000;
for (int i = 0; i < testTImes; i++)
int [] arr= Comp.randomIntArray(MaxLength,MaxValue);
InsertSort(arr);
if(!Comp.isSortedByAsc(arr))
System.out.println("插入排序错误");
创作打卡挑战赛
赢取流量/现金/CSDN周边激励大奖
以上是关于每日算法220503随机数和对数器的主要内容,如果未能解决你的问题,请参考以下文章
Java算法 -- 选择排序冒泡排序插入排序前缀和数组Java中的Math.random()函数01不等概率随机到01等概率随机从[1,5]随机到[1,7]随机对数器的使用
Java算法 -- 选择排序冒泡排序插入排序前缀和数组Java中的Math.random()函数01不等概率随机到01等概率随机从[1,5]随机到[1,7]随机对数器的使用
Java算法 -- 选择排序冒泡排序插入排序前缀和数组Java中的Math.random()函数01不等概率随机到01等概率随机从[1,5]随机到[1,7]随机对数器的使用
Java算法 -- 选择排序冒泡排序插入排序前缀和数组Java中的Math.random()函数01不等概率随机到01等概率随机从[1,5]随机到[1,7]随机对数器的使用