100道面试必会算法-07-用 Rand7() 实现 Rand10()

100道面试必会算法-07-用 Rand7() 实现 Rand10()

题目描述

给定方法 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:与正确答案类似但不知道怎么处理,将 rand7()*rand7()然后就想办法把取值放在1-10之间,但没有好的方法

2:第二个方法就更取巧了,把rand7()进行放大,rand7()*1.5然后再向下取整(强制转换为整形刚刚好)但好像没办法取到3,就改乘1.45,取到了但测试不通过。

上述不通过原因应该是概率问题,本来是1-7我只用一个rand将其放大到1-10,概率不为均等(猜测,八九不离十吧)

好心的大佬的思路如下:

  • 传送门https://leetcode.cn/problems/implement-rand10-using-rand7/solutions/139870/xiang-xi-si-lu-ji-you-hua-si-lu-fen-xi-zhu-xing-ji/

最终代码

public int rand10() {
        while (true){
            int num = (rand7() - 1) * 7 + rand7();
            // 如果在40以内,那就直接返回
            if(num <= 40) return 1 + num % 10;
            // 说明刚才生成的在41-49之间,利用随机数再操作一遍
            num = (num - 40 - 1) * 7 + rand7();
            if(num <= 60) return 1 + num % 10;
            // 说明刚才生成的在61-63之间,利用随机数再操作一遍
            num = (num - 60 - 1) * 7 + rand7();
            if(num <= 20) return 1 + num % 10;

        }
    }

路漫漫其修远兮,吾将上下而求索

最近更新

  1. TCP协议是安全的吗?

    2024-03-20 21:52:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-20 21:52:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-20 21:52:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-20 21:52:02       20 阅读

热门阅读

  1. linux修改终端前缀名称

    2024-03-20 21:52:02       22 阅读
  2. 特殊类设计

    2024-03-20 21:52:02       19 阅读
  3. 【NC16783】拼数

    2024-03-20 21:52:02       20 阅读
  4. 学习编程照着别人的代码敲进去有效率吗?

    2024-03-20 21:52:02       24 阅读
  5. 9. 回文数

    2024-03-20 21:52:02       18 阅读
  6. Spring Data访问Elasticsearch----CDI集成

    2024-03-20 21:52:02       20 阅读
  7. 油烟净化器:餐饮店经营的重要保障

    2024-03-20 21:52:02       19 阅读
  8. 枚举算法总述

    2024-03-20 21:52:02       22 阅读
  9. 缓存知识回顾

    2024-03-20 21:52:02       22 阅读
  10. VUE el-button按下后连续触发

    2024-03-20 21:52:02       21 阅读