问题: 写一个 1-5 的均分算法
- 代码实现
/**
* 1 - 5 均分
* @return
*/
public static int oneToFiveAverageTest(){
return (int) (Math.random()*5)+1;
}
- 测试代码
public static void main(String[] args) {
int[] arr = new int[5];
for (int i = 0; i < 1000000; i++) {
arr[oneToFiveAverageTest()-1]++;
}
for (int i = 0; i < arr.length; i++) {
System.out.println("第"+(i+1)+"数量为:"+arr[i]);
}
}
第1数量为:199815
第2数量为:200012
第3数量为:200342
第4数量为:200245
第5数量为:199586
问题: 在原有的1-5均分的基础上 计算0-7的均分
- 代码实现
- 通过 1 – 5 均分,实现 0 - 1 的均分
- 通过位运算 左移 实现 最小为0 最大为7的均分
//通过 1- 5的均分 获取 0 和 1 的均分
public static int getAverage(){
int ant = 0;
do {
ant = oneToFiveAverageTest();
}while (ant == 3);
return ant>3?0:1;
}
//运用位运算 左移 做到0-7均分
public static int oneToSevenAverageTest(){
return (getAverage()<<2)+(getAverage()<<1)+(getAverage()<<0);
}
- 测试代码
public static void main(String[] args) {
int[] arr = new int[8];
for (int i = 0; i < 1000000; i++) {
arr[oneToSevenAverageTest()]++;
}
for (int i = 0; i < arr.length; i++) {
System.out.println("第"+(i)+"数量为:"+arr[i]);
}
}
第0数量为:125396
第1数量为:125174
第2数量为:124656
第3数量为:125145
第4数量为:124632
第5数量为:125111
第6数量为:125103
第7数量为:124783
问题 如何以 x - y 的均分 实现z - j 位置数据均分
实现思路:
- 先平均分割 x - y 的值
- 如果是 0 - x/2 返回 0
- 如果是 x/2 - y 返回 1
- 如果不是偶数,x/2 重新循环计算
- 再计算 0 到 j-z+1 位置的均分
- 使用位运算
- 如果最高位 位运算大于 j-z+1 则跳过重新计算
- 最后循环计算结果 + j-z+1