两种经典方法解决随机数生成问题--利用rand5得到rand7

2023-12-20 14:36

本文主要是介绍两种经典方法解决随机数生成问题--利用rand5得到rand7,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

两种方法:

  • 等概率得到0和1,然后利用二进制移位运算生成随机数
  • 基于N * (randN - 1) + randN,可以等概率地生成1-N*N之间的数字

利用rand5得到rand7 为例说明

# 一个函数可以实现1-5的随机数,设计另一个函数,实现1-7的随机数
class Rand2rand:def f5(self):return int(random.random() * 5) + 1# 等概率得到0和1def g01(self):while True:tmp = self.f5()if tmp < 3:return 0elif tmp > 3:return 1else:continue# 等概率得到0-6def f06(self):while True:tmp = (self.g01() << 2) + (self.g01() << 1) + (self.g01() << 0)if tmp == 7:continueelse:return tmp# 等概率得到1-7def f17(self):return self.f06() + 1# 验证结果def testRes(self, testTimes: int, rand_generator):arr = [0] * 7for i in range(testTimes):tmp = rand_generator()arr[tmp - 1] += 1for i in range(len(arr)):print(f'{i + 1} 出现了 {arr[i]} 次')def f17_2(self):# 5*(self.f5()-1) 等概率产生 0, 5, 10, 15, 20# self.f5() 等概率产生 1,2,3,4,5# 想加后,等概率产生 1-25# rand5()可以得到rand25()# rand25()可以得到rand625()# 总结,若randN() 可以随机生成1-N,那么N*(randN()-1) + randN() 可以随机生成 1-N**2randVal = 22while randVal > 21:randVal = 5 * (self.f5() - 1) + self.f5()return 1 + randVal % 7# 结果验证
if __name__ == '__main__':obj = Rand2rand()rand_gen1 = obj.f17rand_gen2 = obj.f17_2obj.testRes(1000000, rand_gen2)

class Rand2randGeneral:"""更一般的问题,给定一个可以产出[min, max]之间的等概率随机数函数,生成一个可以等概率生成[from, to]之间的随机数函数"""def __init__(self, min, max):self.min = minself.max = maxdef randomBox(self):diff = int(random.random() * (self.max - self.min + 1))randomValue = self.min + diffreturn randomValuedef getrand01(self):size = self.max - self.min + 1# 判断size 是奇数还是偶数isOdd = True if (size & 1) != 0 else Falsemid = int(size / 2)while True:ans = self.randomBox() - self.minif isOdd and ans == mid:continueelif ans < mid:return 0else:return 1def getRandGeneral(self, fromValue, toValue):if fromValue == toValue:return fromValuerangeVal = toValue - fromValuenum = 1while (1 << num) - 1 < rangeVal:num += 1while True:ans = 0for i in range(num):ans |= self.getrand01() << iif ans > rangeVal:continueelse:return ans + fromValue

这篇关于两种经典方法解决随机数生成问题--利用rand5得到rand7的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/516394

相关文章

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W