每日算法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]随机对数器的使用

对数器的使用

初级--02---前缀和数组Math.random()对数器和随机行为