题目描述:给你一个函数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()相关推荐

  1. 算法与数据结构实验题 10.16 被Gank的亚索

    算法与数据结构实验题 10.16 被Gank的亚索 ★实验任务 "哈撒给~",亚索一个Q打中了残血的维克多并挂上了点燃,正当亚索准备单杀维克多时,突然一声大喝!从两边草丛中窜出了两 ...

  2. 算法题10 最长等差序列问题

    题目 给定一个大小为n的数组,要求写出一个算法,求其最长的等差数列的子序列 分析 该题需要分几种情况考虑. 1. 原数组是有序的,所要求的的子序列可以不连续. 对于数组arr[],不同的等差值d=1, ...

  3. 每天一道算法题(10)——数对之差的最大值

             题目:在数组中,数字减去它右边的数字得到一个数对之差.求所有数对之差的最大值.例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16 减去5 ...

  4. 【经典算法题-10】背包问题(Knapsack Problem)

    欢迎关注公众号[搞前端的半夏],回复[算法],获取各种算法资料. 说明 假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得之总价物品,假设是水果好了,水果的编号.单价与重量如下所示: ...

  5. LeetCode算法题10:DFS/BFS-扫雷游戏

    文章目录 前言 一.扫雷游戏 DFS : BFS 二.被围绕的区域 DFS 1: DFS 2: 总结 前言 DFS 和 BFS,可参考之前的一篇文章:https://blog.csdn.net/Lit ...

  6. 算法导论 10.1-6

    题目:用两个栈实现一个队列,并分析相关队列操作的运行时间 解答: 1.使用两个栈S1与S2: 2.通过栈S1的Push执行队列入队操作,通过栈S2的Pop执行队列出队操作 3.当栈S2为空后,即S1- ...

  7. 【经典题目】rand7()生成rand10()——随机数算法

    随机数算法的转换 从小数向大数映射 这一类的算法主要分为两种,一种是从小数映射向大数,rand7()-->rand10().另外一种是从大数映射向小数rand10()-->rand7() ...

  8. 字节跳动3月面试遇到的高频算法题

    本文汇总了牛客2021.3.1~2021.3.30 面经考到的Leetcode题目 最终的高频题榜单数据可以在CodeTop题库(https://codetop.cc)查询,支持按部门.岗位分类筛选. ...

  9. C1模拟试卷的一个算法题

    C1模拟试卷的一个算法题 题目: 使用Math生成一个随机数,这个随机数需要在0到500之间. 然后,在网页中打印出来从10到这个随机数的回文数. 代码实现: <!DOCTYPE html> ...

最新文章

  1. ArcGIS工具备忘
  2. Dom方法,解析XML文件
  3. tensowflow 训练 远程提交_一文说清楚Tensorflow分布式训练必备知识
  4. 走过路过来看看各种实现跨域的方式~
  5. python子进程关闭fd_如果创建了multiprocessing.Pool,Python子进程wait()将失败
  6. pyspark报错java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
  7. 简单英文题 16 Maximum Sum Not Exceeding K(python)
  8. I/O设备的基本概念和分类
  9. 【Oracle】SCOPE=MEMORY|SPFILE|BOTH
  10. 案例:如何解决难以重现的BUG
  11. 怎么批量删除html里的字段,shp文件怎么删除字段
  12. 怎么通过服务器性能计算tpmc,如何对服务器性能计算的公式参考(tpmc-tpcc)...pdf
  13. graphene-django开发实践——登录为例
  14. Matlab的中Plot函数的基本用法(详解)
  15. 许啸宇:从内部研发到开源开发之路|OneFlow U
  16. 力扣:编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
  17. 大学学计算机专业要自带电脑吗,大学上课要带电脑吗
  18. 线性回归、lasso回归、岭回归以及弹性网络的系统解释
  19. 详解 masm + textpad 编译环境的搭建
  20. XY轴控制板,料盒控制板,水路流量控制板,直流电机控制方案和程序代码

热门文章

  1. 舔狗日记生成器附iapp源码
  2. 【Python抽奖系统】好消息:史上最强商场抽奖活动来啦,超优惠,攻略快拿好啦~(超牛)
  3. Efficientdet译文
  4. Word写作排版小技巧
  5. 11-999之间的所有三重回文数字
  6. 移动5G和5GWIFI的区别
  7. 如何实现网站的登录功能
  8. 计算机毕业设计ssm+vue基本微信小程序的执法助手平台
  9. 神经网络简介--激活函数、网络架构、生物模型解释
  10. 自动生成艾宾浩斯记忆规律背单词时间表的Matlab脚本