int 取值范围_一定范围内的随机数

老司机的新问题,取得[min, max]范围的随机数。

C版本的rand函数很不容易用对,直接用rand() % (max - min + 1) + min,这个公式不对。这个公式与取最低位的算法相同,而随机数的最低几位不一定等概率。

Donald Knuth博士教导我们正确的用法是 rand() / ((RAND_MAX + 1U) / (max - min + 1)) + min,这把rand的所有可能的值分成max - min个桶,每个数落入0号到max - 1号桶的概率相等。

C++中有std::uniform_int_distribution<>,可以直接取一定范围正态分布的随机数,我也没有深究过上面那个公式是否不正确。

结果还真的不正确。

因为大多数情况下,RAND_MAX / (max - min + 1) 都除不尽, 小数部分被舍去后,数值偏小。比如[RAND_MAX / 2, RAND_MAX / 2 + 1]这组,如果 RAND_MAX = 11,那么[0 - 4]的rand()被认为是5,概率是5/11,而5-11被认为是6,概率是6/11。

当采样次数与RAND_MAX同数量级时,这个概率差就显示出来了。这个值有时可能只有32767。大部分平台上这个值 为INT_MAX。

做个游戏什么的,还没有问题,一但用于统计数据,这就出错了。

stackoverflow上有人给出了正确的算法,注意这个算法是[0, max]的区间。

https://stackoverflow.com/questions/2509679/how-to-generate-a-random-integer-number-from-within-a-range#6852396​stackoverflow.com

本质上很简单,就是把RAND_MAX除不尽的部分从rand中消去。

long random_at_most(long max) {unsigned long// max <= RAND_MAX < ULONG_MAX, so this is okay.num_bins = (unsigned long) max + 1,num_rand = (unsigned long) RAND_MAX + 1,bin_size = num_rand / num_bins,defect   = num_rand % num_bins;long x;do {x = random();}// This is carefully written not to overflowwhile (num_rand - defect <= (unsigned long)x);// Truncated division is intentionalreturn x / bin_size;
}

当RAND_MAX不够大时怎么办,可以通过以下公式扩展随机数。

unsigned long newrand  = rand() * ((unsigned long)RAND_MAX +1) + rand() 

注意RAND_MAX的取值,不要溢出了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457953.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

virsh的使用

2019独角兽企业重金招聘Python工程师标准>>> ###这里最先要完成的是对网卡的配置(os ubuntu14.04) 目的是实现vm上是以桥接的方式联网 修改/etc/network/interfaces # interfaces(5) file used by ifup(8) and ifdown(8) auto lo iface lo inet loopback #auto eth0…

嵌入式常见笔试题总结(4)

1&#xff1a;用C语言实现大小端的测试 Int CheckCpu() { union { int a; char b; }c; c.a1; if(c.b1) printf(“小端”)&#xff1b; else printf&#xff08;“大端”&#xff09;&#xff1b; } 2&#xff1a;volatile的作用有哪些&#xff1f; Volatile第一变量相当于告诉编…

《java入门第一季》之类String类小案例

String类有许多获取方法&#xff0c;API文档里面可查看。针对获取方法&#xff0c;给出小案例。 /** 需求&#xff1a;遍历获取字符串中的每一个字符* 分析&#xff1a; 用到两个方法&#xff1a;char charAt(int index) 表示获取字符串指定索引的字符int length() …

同字母异序词 python_49. 字母异位次分组(Python)

题目 给定一个字符串数组&#xff0c;将字母异位词组合在一起。字母异位词指字母相同&#xff0c;但排列不同的字符串。 说明 所有输入均为小写字母。 不考虑答案输出的顺序。 示例 输入: ["eat", "tea", "tan", "ate", "nat&quo…

嵌入式常见笔试题总结(5)

1、 如何在C中初始化一个字符数组。这个问题看似很简单&#xff0c;但是我们要将最简单的问题用最严谨的态度来对待。关键的地方&#xff1a;初始化、字符型、数组。最简单的方法是char array[];。这个问题看似解决了&#xff0c;但是在初始化上好像还欠缺点什么&#xff0c;个…

SQL Server - 高可用与灾难恢复(HADR)技术 -- AlwaysOn可用性组(理论篇)

因为篇幅原因&#xff0c;AlwaysOn可用性组被拆成了两部分&#xff1a;理论部分和实战部分。而实战部分又被拆成了准备工作和AlwaysOn可用性组搭建。 三篇文章各自的链接&#xff1a; SQL Server ->> 高可用与灾难恢复&#xff08;HADR&#xff09;技术 -- AlwaysOn&…

嵌入式常见笔试题总结(6)

一、常识理论题 1、 简述嵌入式操作系统有哪些&#xff0c;你用过哪几种&#xff0c;简述其特点、优势及劣势&#xff1f;(5分) 2、 请描述控制及提高嵌入式软件质量有哪些办法&#xff0c;在开发过程中怎么才能保证嵌入式软件的可靠性&#xff1f;&#xff08;5分&#xff09;…

python 3.6.5编译安装_Linux系统安装Python3.6.5

Linux系统安装Python3.6.5 1、下载Python3.6.5 wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz 如果报command not found则执行&#xff1a;yum -y install wget命令后再进行下载 也可下载好安装包进行手动上传 2、安装Python3.6可能使用的依赖 yum install o…

从传统运维到云运维演进历程之软件定义存储(一)

运维是企业业务系统从规划、设计、实施、交付到运维的最后一个步骤&#xff0c;也是重要的步骤。运维从横向、纵向分可以分为多个维度和层次&#xff0c;本文试图抛开这纷繁复杂的概念&#xff0c;讲述一个传统的企业级运维人员转型到云运维人员&#xff0c;尤其是软件定义存储…

Abp Uow 设计

初始化入口 在AbpKernelModule类中&#xff0c;通过UnitOfWorkRegistrar.Initialize(IocManager) 方法去初始化 1 /// <summary>2 /// This class is used to register interceptor for needed classes for Unit Of Work mechanism.3 /// </summary>4 …

python3.8 实现鼠标自动移动_“新生报到”!【移动机器人 HD-1500】负载1500kg,实现了重型货物运输的自动化...

2020年第三季度欧姆龙自动化&#xff08;中国&#xff09;有限公司新品【移动机器人 HD-1500】即日起在中国市场首次对外发布&#xff0c;实现了重型货物运输的自动化。这款最新的自动化移动机器人重型载荷能力为1500 kg&#xff01;更高的载荷能力可以令客户实现以前无法实现的…

Linux 关闭服务后 鼠标 键盘用不了

大部分情况下我们做实验都是使用虚拟机&#xff0c;但是个人比较本实在太老了&#xff0c;性能有限&#xff0c;所以虚拟机里面的系统启动神慢&#xff0c;怎么办&#xff1f;把系统中自己用不到的服务全部关闭掉呗&#xff0c;如下for i in chkconfig --list | awk {print $1}…

对session的理解

java Servlet API引入session 机制来跟踪客户的状态&#xff0c;session指的是在一段时间内&#xff0c;单个客户和web服务器之间一连串的交互过程&#xff0c;在一个session中&#xff0c;一个客户可能会多次请求同一个网页&#xff0c;也可能请求多个不同服务器资源&#xff…

android 监听本机网络请求_fiddler如何抓取https请求实现fiddler手机抓包-证书安装失败100%解决...

一、HTTP协议和HTTPS协议。(1) HTTPS协议HTTP协议SSL协议&#xff0c;默认端口&#xff1a;443(2) HTTP协议&#xff08;HyperText Transfer Protocol&#xff09;&#xff1a;超文本传输协议。默认端口&#xff1a;80&#xff0c;其中包含请求和响应两部分&#xff0c;其中请求…

c语言笔试题总结2

下列各题A)、B)、C)、D)四个选项中&#xff0c;只有一个选项是正确的&#xff0c;请将正确选项涂写在答题卡相应位置上&#xff0c;答在试卷上不得分。(1)算法的时间复杂度是指_______。A)执行算法程序所需要的时间B)算法程序的长度C)算法执行过程中所需要的基本运算次数D)算法…

C#的四舍五入函数

2019独角兽企业重金招聘Python工程师标准>>> 1.四舍六入&#xff08;国外的四舍五入&#xff09; Math.Round&#xff08;num&#xff09;; 2.四舍五入 Math.Round(num,MidpointRounding.AwayFromZero); 转载于:https://my.oschina.net/CrazyBoy1024/blog/746268

C语言笔试题总结3

4. static有什么用途&#xff1f;&#xff08;请至少说明两种&#xff09;1.限制变量的作用域2.设置变量的存储域7. 引用与指针有什么区别&#xff1f;1) 引用必须被初始化&#xff0c;指针不必。2) 引用初始化以后不能被改变&#xff0c;指针可以改变所指的对象。2) 不存…

【BZOJ2243】 [SDOI2011]染色

Description 给定一棵有n个节点的无根树和m个操作&#xff0c;操作有2类&#xff1a; 1、将节点a到节点b路径上所有点都染成颜色c&#xff1b; 2、询问节点a到节点b路径上的颜色段数量&#xff08;连续相同颜色被认为是同一段&#xff09;&#xff0c;如“112221”由3段组成&am…

jquery easyui DataGrid 数据表格 属性

扩展自 $.fn.panel.defaults &#xff0c;用 $.fn.datagrid.defaults 重写了 defaults 。 依赖 panelresizablelinkbuttonpagination用法 1. <table id"tt"></table> 1. $(#tt).datagrid({ 2. url:datagrid_data.json, 3. columns:[…

C语言笔试题总结

1. 下面这段代码的输出是多少(在32位机上). char *p; // 4 char *q[20]; // 80 char *m[20][20]; // 1600 int (*n)[10]; // 4 struct MyStruct { char dda; double dda1; int type ; }&#xff1b; MyStruct k; // 24 printf("%d %d %d %d",sizeof(p),siz…