两种经典方法解决随机数生成问题--利用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

相关文章

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

idea中project的显示问题及解决

《idea中project的显示问题及解决》:本文主要介绍idea中project的显示问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录idea中project的显示问题清除配置重China编程新生成配置总结idea中project的显示问题新建空的pr

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

redis在spring boot中异常退出的问题解决方案

《redis在springboot中异常退出的问题解决方案》:本文主要介绍redis在springboot中异常退出的问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴... 目录问题:解决 问题根源️ 解决方案1. 异步处理 + 提前ACK(关键步骤)2. 调整Redis消费者组

Nginx 413修改上传文件大小限制的方法详解

《Nginx413修改上传文件大小限制的方法详解》在使用Nginx作为Web服务器时,有时会遇到客户端尝试上传大文件时返回​​413RequestEntityTooLarge​​... 目录1. 理解 ​​413 Request Entity Too Large​​ 错误2. 修改 Nginx 配置2.1

使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案

《使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案》在SpringBoot应用中,我们经常使用​​@Cacheable​​注解来缓存数据,以提高应用的性能... 目录@Cacheable注解Redis时,Redis宕机或其他原因连不上,继续调用原方法的解决方案1

sql语句字段截取方法

《sql语句字段截取方法》在MySQL中,使用SUBSTRING函数可以实现字段截取,下面给大家分享sql语句字段截取方法,感兴趣的朋友一起看看吧... 目录sql语句字段截取sql 截取表中指定字段sql语句字段截取1、在mysql中,使用SUBSTRING函数可以实现字段截取。例如,要截取一个字符串字

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见