一般笔试面试中常会有概率问题的出现(算法较多),他们有这样的规律:
概率的应用有两块:
现在我们来看案例:
案例1
所以两强不相遇的概率为
那么两强相遇的概率为
案例2
案例3
案例4
关于步骤5的解释是,如果产生了21,22,23,24,那么重新进行步骤4,直到结果在0到20之间,这样产生21到24的概率会平均分配到0~20之间。但是我的疑问是,如果用其他方法,不也可以这么产生吗?
案例5
案例6
如果调用f()两次,返回的结果仍然是[0, X)区间上的话,那么两次调用f()的返回值都必须落在[0, X)区间上,否则就会返回大于X的数了。所有,k次同理
案例7
首先,先插一条程序
//这个程序确实证明了Math.random()是从[0,1)随机的,但是这里不能用,因为可能
//打印M个数的时候,有可能重复打印。
public static void main(String[] args){
int[] array = new int[]{1, 2, 3, 4, 5};
ArrayList<Integer> list1 = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();
ArrayList<Integer> list3 = new ArrayList<>();
ArrayList<Integer> list4 = new ArrayList<>();
ArrayList<Integer> list5 = new ArrayList<>();
for(int i = 0; i < 100000; i++){
int num = array[(int)(Math.random() * array.length)];
if(num == 1){
list1.add(num);
}else if(num == 2){
list2.add(num);
}else if(num == 3){
list3.add(num);
}else if(num == 4){
list4.add(num);
}else if(num == 5){
list5.add(num);
}
}
System.out.println(list1.size());
System.out.println(list2.size());
System.out.println(list3.size());
System.out.println(list4.size());
System.out.println(list5.size());
}
把每次打印的数都交换到最后,是防止重复打印