当前位置: 首页 > article >正文

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

Problem: 470. 用 Rand7() 实现 Rand10()
在这里插入图片描述

文章目录

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

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

👩‍🏫 参考题解

在这里插入图片描述

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

🍺 朴素版

class Solution extends SolBase {

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

🍺 优化版

在这里插入图片描述

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)
/**
 * 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;
    }

}

在这里插入图片描述


http://www.kler.cn/a/549438.html

相关文章:

  • SOCKET建立简单的tcp服务端与客户端通信
  • 【Elasticsearch】match查询
  • Matlab实现POA-BP鹈鹕算法优化BP神经网络多输入多输出预测
  • 简单几个步骤完成 Oracle 到金仓数据库(KingbaseES)的迁移目标
  • HTTP的前世今生:如何塑造现代互联网的交互方式?
  • ML.NET库学习008:使用ML.NET进行心脏疾病预测模型开发
  • Linux运维篇-存储基础知识
  • git开发流程以及github社区企业版
  • Redis未授权访问漏洞导致getshell
  • Moya 网络框架
  • Transformer以及BERT阅读参考博文
  • python大恒相机保存RAW图和实时显示
  • Java ArrayList(单列集合)
  • 【CUDA】Pytorch_Extensions
  • 数据仓库与数据挖掘记录 二
  • 【Azure 架构师学习笔记】- Azure Databricks (11) -- UC搭建
  • 【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析③】
  • Linux:深入了解进程信号(上)
  • DeepSeek与ChatGPT:AI语言模型的全面对决
  • 生成式大模型 怎么结合 知识库与 AI Agent