- 货币名称
- 南非的货币名称
- 函数名
- C语言的一个函数名
- 中文名
- rand
- 公 司
- 美国兰德公司
-
2022-02-03 14:39:29
题目:假如有了一个从自然数中随机取一个数的函数rand(0,7)——从0到7中随机取一个自然数出来,问如何用这个函数构造rand(0,10)——随机从0到10中取一个自然数出来。
PS:该题目是在rand(10)没有现成函数的前提下实现的,必须通过rand(7)去构造
(提示:需要注意函数的分布,可以用蒙特卡洛的方法进行验证)
错误思路:
设A为rand(0,7),B为rand(0,7),这两个都是从0到7中随机取得数,然后把取到的结果相加,如果结果大于10,就重新执行,否则就返回相加的结果。python实现代码如下:
import random def rand_10(): C = 11 while C>10: A = random.randint(0,7) B = random.randint(0,7) C = A+B return C
python执行0次的获得的结果如下:
这种解题思路获得的结果是0到10之间的自然数,但是结果却是不对的,先看正确的解题思路,再说明为什么这样取值不对。
正确思路:
设A为rand(0,7),B为rand(0,7),这两个都是从0到7中随机取得数。A作为高位(十位),B作为低位(个位),计算A*8+B的值,得到的是63以内的整数,得到的数据仍为均匀分布,然后我们把结果模11,得到0到10以内的自然数,但是63模11结果为8,那么0~8比9、10结果就会多一次,所以我们只取0~54的数,去模11,代码如下:
def rand_10_2(): rand_all = 55 while rand_all >= 55: #A*8+B最大取值为63,模11得8,0~8比9,10就会多一次,所以计算到54,每个数平均出现5次 A = random.randint(0,7) #8进制高位 B = random.randint(0, 7) #8进制低位 rand_all = A*8+B C = rand_all%11 #0~10的自然数,包含0和10 return C
也执行20次 ,得到的数都是0到10之间的整数。
, 验证结果:
要验证两种结果哪种是对的,首先我们得明白,rand函数是从一组数中随机取一个数的函数,那么它要服从均匀分布,这样才能保证每个数取到的概率都一样。我们用蒙特卡洛方法进行验证,即模拟100000或更多次数,然后统计每个数出现的次数,看统计出的结果的直方图,从直方图就能看出是不是服从均匀分布。
1、验证系统自带的函数服从的分布,代码如下:
import random import numpy as np import matplotlib.pyplot as plt y = [0]*8 # 存放rand函数得到的值的个数 for i in range(100000): # 十万个数据中取值,进行验证 num_1 = random.randint(0,7) for j in range(0,8): if j == num_1: y[j] +=1 x = np.linspace(0, 7, num=8) plt.bar(x, y, align='center', alpha=0.7) plt.xlabel('num for rand') plt.ylabel('count for rand') plt.title('rand(7)') plt.show() #用直方图显示得到的结果
运行后得到的直方图如下:
8个数得到的结果基本相等,说明python 系统自带的函数是服从均匀分布的。
2、两个rand函数相加的方法得到rand(10)的方法,用该方法进行验证
代码如下:
import random import numpy as np import matplotlib.pyplot as plt def rand_10(): C = 11 while C>10: A = random.randint(0,7) B = random.randint(0,7) C = A+B return C y = [0]*11 # 存放rand函数得到的值的个数 for i in range(150000): # 十万个数据中取值,进行验证 num_1 = rand_10() for j in range(0,11): if j == num_1: y[j] +=1 x = np.linspace(0, 10, num=11) plt.bar(x, y, align='center', alpha=0.7) plt.xlabel('num for rand') plt.ylabel('count for rand') plt.title('rand(10)_add') plt.show() #用直方图显示得到的结果
运行后得到的直方图如下:
从图中可以看出该分布不是均匀分布,而是服从泊松分布即正态分布的,至于为什么服从这种分布,后面有时间再讲解。
3、高位*进制+低位的方法得到的结果进行验证
def rand_10_2(): rand_all = 55 while rand_all >= 55: #A*8+B最大取值为63,模11得8,0~8比9,10就会多一次,所以计算到54,每个数平均出现5次 A = random.randint(0,7) #8进制高位 B = random.randint(0, 7) #8进制低位 rand_all = A*8+B C = rand_all%11 #0~10的自然数,包含0和10 return C y = [0]*11 # 存放rand函数得到的值的个数 for i in range(150000): # 十万个数据中取值,进行验证 num_1 = rand_10_2() for j in range(0,11): if j == num_1: y[j] +=1 x = np.linspace(0, 10, num=11) plt.bar(x, y, align='center', alpha=0.7) plt.xlabel('num for rand') plt.ylabel('count for rand') plt.title('rand(10)_ocx') plt.show() #用直方图显示得到的结果
运行后得到结果如下:
从直方图可以看到该结果服从均匀分布。
更多相关内容 -
PHP随机数函数rand()与mt_rand()的讲解
2021-01-21 19:33:04mt_rand() 则是用了 Mersenne Twister 中已知的特性作为随机数发生器,它产生随机数值的平均速度比 libc 提供的 rand() 快四倍。所以在PHP中mt_rand()函数是非正式用来替换rand()的。 语法: rand -
详解C语言中rand函数的使用
2021-01-20 07:04:46我们使用C语言的rand函数,生成的也是伪随机数。 c语言之rand函数的使用 1、写入头文件 #include <stdlib> #include <stdio> #include 2、变量的定义 void main( void ) { int i,k; 3、srand( (unsigned)time( ... -
生成随机数rand函数的用法详解
2021-01-01 01:50:34函数rand()是真正的随机数生成器,而srand()会设置供rand()使用的随机数种子。如果你在第一次调用rand()之前没有调用srand(),那么系统会为你自动调用srand()。而使用同种子相同的数调用 srand()会导致相同的随机数... -
MySQL的指定范围随机数函数rand()的使用技巧
2020-12-15 20:45:41rand() * (y-x) + x 咱们学php的都知道,随机函数rand或mt_rand,可以传入一个参数,产生0到参数之间的随机整数,也可以传入两个参数,产生这两个参数之间的随机整数。 而在mysql里,随机数函数rand不能传参,产生的... -
PHP中函数rand和mt_rand的区别比较
2020-12-19 15:32:28PHP函数rand和mt_rand mt_rand() 比rand() 快四倍 很多老的 libc 的随机数发生器具有一些不确定和未知的特性而且很慢。PHP 的 rand() 函数默认使用 libc 随机数发生器。mt_rand() 函数是非正式用来替换它的。该函数... -
MySQL rand函数实现随机数的方法
2020-12-16 06:04:14顺便给你找了点关于mysql rand函数的实例,如下:那就在insert 命令中,value()里面用rand(),注意字段宽度是否够一直以为mysql随机查询几条数据,就用SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了。 -
rand-terrorism-dataset.txt
2020-06-01 20:00:43nlp常用工具包实战(4)spacy工具包,第五点,即第二个案例分析所用资源 111111111 vhbjnkl,/,nbvcx -
聚类算法评价指标:RandIndex,matlab代码
2021-03-11 20:38:32聚类算法评价指标:RandIndex,matlab代码 -
Java实现 LeetCode 470 用 Rand7() 实现 Rand10()
2020-12-22 02:04:46470. 用 Rand7() 实现 Rand10() 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。 不要使用系统的 Math.random() 方法。 示例 1: 输入: 1 输出: [7] ... -
有关C++中随机函数rand() 和srand() 的用法详解
2020-08-31 17:26:31下面小编就为大家带来一篇有关C++中随机函数rand() 和srand() 的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
用C语言的rand()和srand()产生伪随机数的方法总结
2020-12-22 18:56:52函数一:int rand(void); 从srand (seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数。 函数二:void srand(unsigned seed); 参数seed是rand()的种子,用来初始化rand()的... -
随机数生成rand.cpp
2021-04-19 11:40:20随机数生成rand.cpp -
php中mt_rand()随机数函数用法
2021-01-20 00:43:14说明:如果没有提供可选参数 min 和 max,mt_rand() 返回 0 到 rand_max 之间的伪随机数,例如想要 5 到 15(包括 5 和 15)之间的随机数,用 mt_rand(5,15). 在 3.0.7 之前的版本中,max 的含义是 range,要在这些版本中... -
php中随机函数mt_rand()与rand()性能对比分析
2020-10-25 03:51:44主要介绍了php中随机函数mt_rand()与rand()性能对比分析,较为详细的分析了两个函数的具体用法,并以实例形式分析了在不同平台下的运行效率问题,需要的朋友可以参考下 -
c代码-rand那个
2021-07-14 20:32:05c代码-rand那个 -
ingersoll rand 拧紧枪说明书
2019-02-19 08:43:29ingersoll rand ics-connect 软件拧紧枪说明书(中文版) -
MySQL优化之对RAND()的优化方法
2020-09-10 13:56:41主要介绍了MySQL优化之对RAND()的优化方法,本文详细分析了Mysql中对RAND()的几种优化方法,并最终得出一个结论,需要的朋友可以参考下 -
MySQL Order By Rand()效率分析
2020-09-11 01:13:18本文详细解说了MySQL Order By Rand()效率优化的方案,并给出了优化的思路过程,是篇不可多得的MySQL Order By Rand()效率美 -
产生随机数的rand()函数的使用方法.
2017-12-21 23:34:15产生随机数的rand()函数的使用方法.产生随机数的rand()函数的使用方法. -
rand-range:获取一个范围内的随机数
2021-04-27 13:22:34兰德范围 获取给定范围内的随机数(整数或浮点数)。 安装 $ npm install rand-range -
C语言srand和rand用法详解
2020-07-25 18:37:50本文主要对C语言中srand和rand的用法进行详解。 -
php数组函数序列 之shuffle()和array_rand() 随机函数使用介绍
2020-10-28 07:34:09shuffle与array_rand定义和用法,需要的朋友可以参考下。 -
matlab中使用rand函数产生随机数
2015-11-05 17:29:13详细介绍了matlab中使用rand函数产生随机数的方法 -
matlab-rand()函数五种用法.docx
2021-03-11 22:06:58matlab-rand()函数五种用法.docx -
Rand函数详细讲解
2013-12-29 20:42:45Rand函数的详细讲解,Rand函数在软件开发中有着广泛的使用