LeeCode 445. 用 Rand7() 实现 Rand10() [中等 43.6%]

已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。

不要使用系统的 Math.random() 方法。

示例 1:

输入: 1
输出: [7]
示例 2:

输入: 2
输出: [8,4]
示例 3:

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

提示:

rand7 已定义。
传入参数: n 表示 rand10 的调用次数。
 

进阶:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/implement-rand10-using-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的概率相同。

所以程序思路就很明了,当结果扫到右上角的时候进行递归调用,直到输出其他结果。

平均调用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
)
from random import randint
class Solution:
    def rand10(self):
        """
        :rtype: int
        """
        a = self.rand7()
        b = self.rand7()
        if a > 4 and b < 4:
            return self.rand10()
        else:
            return (a + b) % 10 + 1

    def rand7(self):
        return randint(1, 7)

if __name__ == '__main__':
    s = Solution()
    print(s.rand10())
    print(s.rand10())
    print(s.rand10())

输出结果:

D:\Anaconda3\python.exe G:/LeeCode/470.py
5
10
8

Process finished with exit code 0

注意:

其中有不少答案是使用

int a=(rand7()-1)*7+rand7();//1-49
if(a<=40) 
   return a%10+1

错误点:

  • num 在值为[1->49],但是值为7, 14, 21, 28, 35, 42时,出现了两次,也就是说总样本并不是49,而是55
  • if 语句中的条件是想删除[41->49]这九个样本,但是样本并不是40,而是45。

转载于:https://my.oschina.net/gain/blog/3095288

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以的,以下是一个可能的 Python 代码示例: ```python import matplotlib.pyplot as plt # 原始数据 invest_increase = 0.2 irr_decrease = 0.043 payback_increase = 0.2 npv_negative = 0.1 irr_increase = 0.9 payback_decrease = 1.0/6 output_decrease = 0.2 # x轴数据:各个参数变化的幅度 x = ['Investment', 'Unit price', 'Output'] dx = [invest_increase, -npv_negative, -output_decrease] # y轴数据:敏感性分析结果 y_irr = [irr_decrease * dx[0], irr_increase * dx[1], -0.306 * dx[2]] y_payback = [payback_increase * dx[0], -payback_decrease * dx[1], None] y_npv = [None, None, None] if dx[1] > 0: y_npv[1] = -1 if dx[1] < 0: y_npv[1] = 1 # 绘制折线图 plt.plot(x, y_irr, '-o', label='IRR') plt.plot(x, y_payback, '-o', label='Payback') plt.plot(x, y_npv, '-o', label='NPV') plt.legend() plt.title('Sensitivity Analysis') plt.xlabel('Parameter') plt.ylabel('Change in %') plt.show() ``` 说明: - 原始数据是根据题目给出的变化幅度计算得到的。 - `x` 列表是各个参数的名称,`dx` 列表是它们的变化幅度。 - `y_irr`、`y_payback` 和 `y_npv` 列表分别是敏感性分析结果的变化幅度,未知的值用 `None` 表示。其中,`y_irr` 和 `y_payback` 是可以计算得到的,`y_npv` 则需要根据题目的条件判断。 - `plt.plot()` 函数用于绘制折线图。`-o` 表示用实心圆点标记数据点。`label` 参数是图例的标签。 - `plt.legend()` 函数用于显示图例。 - `plt.title()`、`plt.xlabel()` 和 `plt.ylabel()` 函数分别用于设置图表的标题、横轴和纵轴的标签。 - `plt.show()` 函数用于显示图表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值