【每天学点算法题10.16】由rand7()生成rand10()
题目描述:给你一个函数rand7(),它可以等概率地生成1~7之间的随机数,使用这个函数rand7(),生成一个函数rand10(),使其能够等概率地生成1~10之间的随机数。
解决办法:舍去法。我们知道rand7()等概率地生成1~7之间的数,而rand10()等概率地生成1~10之间的数,但是rand7()没法生成8,9,10。不过如果我们有rand10()函数如何生成rand7()呢?一个很直接的方法就是不停地调用rand10()函数,直到其产生1~7之间的数。代码示例如下。
public int rand7(){
int x;
do{
rand10();
}while(x>7);
return x;
}
这样我们可以得到一个一般的结论,如果a>b,那么我们可以由randa()得到randb()。代码示例如下。
//a>b
public int randb(){
int x;
do{
randa();
}while(x>b);
return x;
}
那么既然我们无法使用rand7()直接生成rand10(),那么我们就用rand7()构造一个更大的数来生成rand10()。我们使用这个组合:7*(rand7()-1)+rand7()。rand7()生成1~7之间的数,那么ran7()-1就是0~6,7*(rand7()-1)可以得到0,7,14,21,28,35,42,再加上rand7()就可以得到1~49之间的数。套用上面的一般结论我们可以得到如下代码:
public int rand10()
{
int x;
do{
x=7*(rand7()-1)+rand7();
}while(x>10);
return x;
}
这样代码虽然没什么问题,但是要进行do...while循环很多次才能跳出,所以大大降低了效率。所以我们要舍弃一部分组合可以产生的数,让do...while循环次数减少,我们把判断条件改为x与最接近组合最大数的10的倍数相比较,这里就是x与40相比,得出的结果我们再使之取模得到1~10里面的随机数。代码示例如下:
public int rand10(){
int x;
do{
x=7*(rand7()-1)+rand7();
}while(x>40);
return x%10+1;
}
这样我们可以得出一个一般化的结论,如果a<b,那么我们也可以由randa()得出randb()。我们先构造一个数A=a*(randa()-1)+randa(),得到randA(),此时如果A还是小于b的话,还可以再对A进行上述组合构造。示例代码如下:
public int randb(){
int x;
do{
x=a*(randa()-1)+randa();
}while(x>b*(A/b));
return x;
}
【每天学点算法题10.16】由rand7()生成rand10()相关推荐
- 算法与数据结构实验题 10.16 被Gank的亚索
算法与数据结构实验题 10.16 被Gank的亚索 ★实验任务 "哈撒给~",亚索一个Q打中了残血的维克多并挂上了点燃,正当亚索准备单杀维克多时,突然一声大喝!从两边草丛中窜出了两 ...
- 算法题10 最长等差序列问题
题目 给定一个大小为n的数组,要求写出一个算法,求其最长的等差数列的子序列 分析 该题需要分几种情况考虑. 1. 原数组是有序的,所要求的的子序列可以不连续. 对于数组arr[],不同的等差值d=1, ...
- 每天一道算法题(10)——数对之差的最大值
题目:在数组中,数字减去它右边的数字得到一个数对之差.求所有数对之差的最大值.例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16 减去5 ...
- 【经典算法题-10】背包问题(Knapsack Problem)
欢迎关注公众号[搞前端的半夏],回复[算法],获取各种算法资料. 说明 假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得之总价物品,假设是水果好了,水果的编号.单价与重量如下所示: ...
- LeetCode算法题10:DFS/BFS-扫雷游戏
文章目录 前言 一.扫雷游戏 DFS : BFS 二.被围绕的区域 DFS 1: DFS 2: 总结 前言 DFS 和 BFS,可参考之前的一篇文章:https://blog.csdn.net/Lit ...
- 算法导论 10.1-6
题目:用两个栈实现一个队列,并分析相关队列操作的运行时间 解答: 1.使用两个栈S1与S2: 2.通过栈S1的Push执行队列入队操作,通过栈S2的Pop执行队列出队操作 3.当栈S2为空后,即S1- ...
- 【经典题目】rand7()生成rand10()——随机数算法
随机数算法的转换 从小数向大数映射 这一类的算法主要分为两种,一种是从小数映射向大数,rand7()-->rand10().另外一种是从大数映射向小数rand10()-->rand7() ...
- 字节跳动3月面试遇到的高频算法题
本文汇总了牛客2021.3.1~2021.3.30 面经考到的Leetcode题目 最终的高频题榜单数据可以在CodeTop题库(https://codetop.cc)查询,支持按部门.岗位分类筛选. ...
- C1模拟试卷的一个算法题
C1模拟试卷的一个算法题 题目: 使用Math生成一个随机数,这个随机数需要在0到500之间. 然后,在网页中打印出来从10到这个随机数的回文数. 代码实现: <!DOCTYPE html> ...
最新文章
- ArcGIS工具备忘
- Dom方法,解析XML文件
- tensowflow 训练 远程提交_一文说清楚Tensorflow分布式训练必备知识
- 走过路过来看看各种实现跨域的方式~
- python子进程关闭fd_如果创建了multiprocessing.Pool,Python子进程wait()将失败
- pyspark报错java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
- 简单英文题 16 Maximum Sum Not Exceeding K(python)
- I/O设备的基本概念和分类
- 【Oracle】SCOPE=MEMORY|SPFILE|BOTH
- 案例:如何解决难以重现的BUG
- 怎么批量删除html里的字段,shp文件怎么删除字段
- 怎么通过服务器性能计算tpmc,如何对服务器性能计算的公式参考(tpmc-tpcc)...pdf
- graphene-django开发实践——登录为例
- Matlab的中Plot函数的基本用法(详解)
- 许啸宇:从内部研发到开源开发之路|OneFlow U
- 力扣:编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
- 大学学计算机专业要自带电脑吗,大学上课要带电脑吗
- 线性回归、lasso回归、岭回归以及弹性网络的系统解释
- 详解 masm + textpad 编译环境的搭建
- XY轴控制板,料盒控制板,水路流量控制板,直流电机控制方案和程序代码