首页 > 其他分享 >470. 用 Rand7() 实现 Rand10()(拒绝采样)

470. 用 Rand7() 实现 Rand10()(拒绝采样)

时间:2022-11-22 21:45:35浏览次数:66  
标签:输出 调用 示例 int rand10 Rand10 rand7 470 Rand7

给定方法 rand7 可生成 [1,7] 范围内的均匀随机整数,试写一个方法 rand10 生成 [1,10] 范围内的均匀随机整数。

你只能调用 rand7() 且不能调用其他方法。请不要使用系统的 Math.random() 方法。

每个测试用例将有一个内部参数 n,即你实现的函数 rand10() 在测试时将被调用的次数。请注意,这不是传递给 rand10() 的参数。

 

示例 1:

输入: 1
输出: [2]

示例 2:

输入: 2
输出: [2,8]

示例 3:

输入: 3
输出: [3,8,10]

 

提示:

  • 1 <= n <= 105

 

进阶:

  • rand7()调用次数的 期望值 是多少 ?
  • 你能否尽量少调用 rand7() ?

本质数学概率题。

枚举如下:
	a	1	2	3	4	5	6	7
b								
1		2	3	4	5	6	7	8
2		3	4	5	6	7	8	9
3		4	5	6	7	8	9	0
4		5	6	7	8	9	0	1
5		6	7	8	9	0	1	2
6		7	8	9	0	1	2	3
7		8	9	0	1	2	3	4
去掉右上角的  
6	7	8
7	8	9
8	9	0      后

每个数字的出现次数为4次,0-9的概率相同

所以程序思路就很明了,当结果扫到右上角的时候进行递归调用,直到输出其他结果
    a=rand7();  b=rand7();
 if(a>4&&b<4)  return rand10();
 else          return (a+b)%10+1;


平均调用2.45次rand7(),
(
PS:解释一下为什么是2.45............拉开看
分布列如下:调用次数为1次,P=40/49;2次P=(9/49)*(40/49);    3次P=(9/49)^2*(40/49); ............N次 P=(9/49)^(n-1)*(40/49);
平均调用次数为期望==(次数*概率)求和==1*40/49+2*(9/49)*(40/49)+(9/49)^2*(40/49)+...............+n*(9/49)^(n-1)*(40/49);
求出后结果为2*49/40=2.45
)
// The rand7() API is already defined for you.
// int rand7();
// @return a random integer in the range 1 to 7

class Solution {
public:
    int rand10() {
        int temp1=rand7();
        int temp2=rand7();
        if(temp1>4&&temp2<4) return rand10();
        return (temp1+temp2)%10+1;
    }
};

 

标签:输出,调用,示例,int,rand10,Rand10,rand7,470,Rand7
From: https://www.cnblogs.com/zzzlight/p/16916540.html

相关文章

  • VS2019 error C4703: 使用了可能未初始化的本地指针变量 "xx"
    在编译VS的时候,遇到这错误,根据参考资料,在”项目属性“-“C/C++”-“常规”-“SDL检查”,将其改为否。(参考资料提到的另一个方法是将指针声明时初始化为nullptr)另外,......
  • VS2019 error C4703: 使用了可能未初始化的本地指针变量 错误
    目录​​一、异常错误​​​​二、原因​​​​三、解决方法​​​​1.关闭安全开发生命周期(SDL)检查​​​​2.或者将指针变量初始化为nullptr​​一、异常错误errorC470......
  • P2470 [SCOI2007]压缩
    传送门区间DP好题,看到这题很容易想到设\(f[i][j]\)为区间\(i\)~\(j\)内的最短折叠,那么转移方程就为:\[f[i][j]=min_{k=i}^{j-1}(f[i][j],f[i][k]+f[k+1][j])\]然鹅这......
  • 【XSY3470】Cherry(后缀数组)
    题意:给一个长度为\(n\)的串\(S\)和一个长度为\(b\)的串\(B\),有\(m\)个文本串,初始它们都是空串。需要支持\(q\)个操作,每个操作要么是给某个文本串后面接上串\(B......
  • Acwing 4708 . 立方体(三维bfs)
    https://www.acwing.com/problem/content/4711/题目没什么难度,但是就是三维有些东西不经常定义记不住。写个题解记录一下吧Acwing1096.地牢大师https://www.acwing.co......
  • 【LeetCode】1470. 重新排列数组(C++)
    1470.重新排列数组(C++)​​1题目描述​​​​2示例描述​​​​2.1示例1​​​​2.2示例2​​​​2.3示例3​​​​3解题提示​​​​4源码详解(C++)​​1题目描述......
  • AcWing 4706 -- 树形DP/DFS
    题目描述4706.最短路程思路dfs代码#include<iostream>#include<cstring>#include<algorithm>#include<vector>usingnamespacestd;constintN=100......
  • [题解]洛谷 P4700
    经典题没做出来,是不是该死?是不是该死?首先缩点什么的都是套路性的,然后发现一个事,你要是缩完点直接做,就相当于有向无玕图上标记一些点,求另一些点能到达多少个标记点,这个似乎......
  • 1470_Linux下使用pdftk进行pdf文件的页面提取以及合并
    全部学习汇总:​​GreyZhang/toolbox:常用的工具使用查询,非教程,仅作为自我参考!(github.com)​​最近在windows上使用pdf的阅读器,想提取几页页面。之前一直使用adobe的工具......
  • 469注解概念和470JDK内置注解
    注解概念注解:*概念︰说明程序的。给计算机看的*注释:用文字描述程序的。给程序员看的*定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是0.1.5及以后版本引入的......