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

力扣 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.dtcms.com/a/21891.html

相关文章:

  • 2.【BUUCTF】[极客大挑战 2020]Roamphp1-Welcome
  • 网易雷火游戏测试开发1面面经(带脑图)
  • 权限五张表
  • React入门 - 0.React简介
  • snort3.0-ubuntu18.04 64入侵检测安装与使用
  • 总结前端常用数据结构 之 数组篇【JavaScript -包含常用数组方法】
  • MYSQL下载安装及使用
  • 四、敏捷方法论:敏捷开发中的关键实践
  • 【第12章:深度学习与伦理、隐私—12.3 深度学习模型的透明性与可解释性提升策略】
  • NumPy中生成和堆叠数组、生成切片的特殊对象:np.r_ np.c_ np.s_
  • RK3588视觉控制器与AI 算法:开启工业视觉检测新境界
  • 数据结构实现顺序表的尾插,尾删,按值查找/修改/删除,按下标查找/增加/删除
  • python学opencv|读取图像(六十五)使用cv2.boundingRect()函数实现图像轮廓矩形标注
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第四节】
  • Java面试第二山!《计算机网络》!
  • VMware Fusion关机Ubuntu虚拟机黑屏解决方法
  • 使用DeepSeek建立一个智能聊天机器人0.12
  • 【玩转全栈】----Django基本配置和介绍
  • sql语言语法的学习
  • 深入理解 MQTT 协议:物联网通信的核心
  • VS Code User和System版区别【推荐使用System版本】and VSCode+Keil协同开发之Keil Assistant
  • 常用查找算法整理(顺序查找、二分查找、插值查找、斐波那契查找、哈希查找、二叉排序树查找、平衡二叉树查找、红黑树查找、B树和B+树查找、分块查找)
  • 国产编辑器EverEdit - 如虎添翼的功能:快速选择
  • pycharm社区版有个window和arm64版本,到底下载哪一个?还有pycharm官网
  • Qt——连接MySQL数据库之编译数据库驱动的方法详细总结(各版本大同小异,看这一篇就够了)
  • CentOS系统docker配置镜像加速registry-mirrors,配置阿里云和道客
  • IDEA通过Contince接入Deepseek
  • QT 互斥锁
  • 初识React
  • 2025年 Java 技术的新趋势