等概率随机数实现:
现在我们需要得到使用一个函数f1,这个函数可以等概率返回1-5,在只可以使用f1的情况下我们将f1如何改造成返回1-7这个函数呢?
*/
public static int f1(){
return (int)(Math.random()*5)+1; //等概率1-5
}
// 随机机制,只用f1生成只返回0和1的等概率函数二
public static int f2(){
int ans = 0;
do {
ans = f1();
}while (ans == 3);
return ans<3?0:1;
}
-
2:然后我们先得到0-7,7用二进制可以表示为111,0就是000,也就是我们将函数f(2)循环执行三次,最后得到的二进制数字就是等概率的0-7:这里的<<就是移位的意思,比如f(2)等于1的时候移位就是:100也就是4 f(2)等于0的时候移位就是:000也就是0,这里先<<2然后加一个<<1然后加一个<<0就可以保证获得一个0-7随机数等概率,这个函数我们叫做f(3)
//三次f2得到000~111做到更改率------>0-7
public static int f3(){
int ans = (f2()<<2)+(f2()<<1)+(f2()<<0);
return ans;
}
// 0-6等概率返回
public static int f4(){
int ans = 0;
do {
ans = f3();
}while (ans==7){
return ans;
}
}
同理我们想要将3-19变成20-56,就可以先将3-19转化为0和1也就是从11分开,只要是11就重来一次,然后3-19变成了01等概率发生器,然后17-56我们怎么得到呢?就是先得到0-38,r然后加17就成了17-56,所以我们现在使用01发生器想办法得到0-39,2的6次方是64,也就是我们需要“扔”6次01发生器,然后就是一个0-63范围的随机数,然后我们只要大于39就重新再来一次,这样的函数就可以返回0-39,
group by 什么时候用?
- 当SELECT 后 既有 表结构本身的字段,又有需要使用聚合函数(COUNT(),SUM(),MAX(),MIN(),AVG()等)的字段,
就要用到group by分组,查询的限定条件里有需要用聚合函数计算的字段时也需要用分组 - WHERE和HAVING的区别,WHERE作用于全表,而HAVING只作用于分组的组内。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/80980.html