力扣 470. 用 Rand7() 实现 Rand10() 拒绝采样 等概率随机数生成

Problem: 470. 用 Rand7() 实现 Rand10()

文章目录

  • [🍻 k 进制诸位生成 + 拒绝采样](#🍻 k 进制诸位生成 + 拒绝采样)
    • [🍺 朴素版](#🍺 朴素版)
    • [🍺 优化版](#🍺 优化版)
  • [🍻 等概率生成任何数大法](#🍻 等概率生成任何数大法)

🍻 k 进制诸位生成 + 拒绝采样

👩‍🏫 参考题解

  • ⏰ 时间复杂度:期望复杂度为 O ( 1 ) O(1) O(1),最坏情况下为 O ( ∞ ) O(∞) O(∞)
  • 🌍 空间复杂度: O ( 1 ) O(1) O(1)

🍺 朴素版

java 复制代码
class Solution extends SolBase {

    // k 进制诸位生成 + 拒绝采样
    public int rand10() {
        while(true){
            int ans = (rand7()-1) * 7 + rand7() - 1;
            if(ans >= 1 && ans <= 10){
                return ans;
            }
        }
    }
}

🍺 优化版

java 复制代码
class Solution extends SolBase {

    // k 进制诸位生成 + 拒绝采样(优化版)
     public int rand10() {
        while (true) {
            int ans = (rand7() - 1) * 7 + (rand7() - 1); // 进制转换
            if (1 <= ans && ans <= 40) return ans % 10 + 1;
        }
    }
}

🍻 等概率生成任何数大法

🧑‍🏫 参考题解 万能解法

  • ⏰ 时间复杂度:期望复杂度为 O ( 1 ) O(1) O(1),最坏情况下为 O ( ∞ ) O(∞) O(∞)
  • 🌍 空间复杂度: O ( 1 ) O(1) O(1)
Java 复制代码
/**
 * The rand7() API is already defined in the parent class SolBase.
 * public int rand7();
 * @return a random integer in the range 1 to 7
 */
class Solution extends SolBase {

    public int rand10() {
        // 生成 1~10 的随机数,最大的 10 的二进制是 1010,所以需要调用四次 rand2()
        int ans = rand2(); // 一位二进制
        for (int i = 0; i < 3; i++) {
            ans <<= 1;
            ans ^= rand2();
        }
        // 超出范围就重试
        return (ans <= 10 && ans > 0) ? ans : rand10();
    }

    // 随机生成 0 和 1
    public int rand2() {
        int ans = rand7();
        // 生成 7 进行重新生成
        // 生成 1~6 按奇偶数进行分类成两种,即 0 和 1
        return ans == 7 ? rand2() : ans % 2;
    }

}
相关推荐
LDG_AGI9 分钟前
【推荐系统】深度学习训练框架(八):PyTorch分布式采样器DistributedSampler原理详解
人工智能·pytorch·分布式·深度学习·算法·机器学习·推荐算法
Nebula_g2 小时前
C语言应用实例:背包DP1(Bone Collector、Piggy-Bank、珍惜现在,感恩生活)
算法
roman_日积跬步-终至千里2 小时前
【模式识别与机器学习(5)】主要算法与技术(中篇:概率统计与回归方法)之逻辑回归(Logistic Regression)
算法·机器学习·回归
Hacker_Oldv7 小时前
数据驱动的测试优化:如何利用数据提高测试效率
自动化测试·软件测试·职场和发展
Promise4857 小时前
贝尔曼公式的迭代求解笔记
笔记·算法
程序员勋勋8 小时前
高频Robot Framework软件测试面试题
测试工具·职场和发展
福尔摩斯张9 小时前
Linux进程间通信(IPC)机制深度解析与实践指南
linux·运维·服务器·数据结构·c++·算法
你好~每一天9 小时前
未来3年,最值得拿下的5个AI证书!
数据结构·人工智能·算法·sqlite·hbase·散列表·模拟退火算法
杰克尼9 小时前
3. 分巧克力
java·数据结构·算法
zmzb01039 小时前
C++课后习题训练记录Day39
数据结构·c++·算法