当前位置: 首页 > 面试题库 >

随机数发生器测试

葛季萌
2023-03-14
问题内容

您将如何测试随机数生成器是否正在生成实际的随机数?

我的方法:首先建立一个大小为M的散列,其中M是素数。然后取由随机数生成器生成的数字,并用M取mod,然后看它是否填充了所有散列或仅填充了一部分。那是我的方法。我们可以通过可视化证明吗?

由于我对测试的了解很少。您能建议我彻底解决这个问题吗?提前致谢


问题答案:

您应该意识到,您不能 保证 随机数生成器正常工作。请注意,即使是[1,10]范围内的完美均匀分布- 在10个数字的随机采样中,也有10
-10的机会得到10乘以10。

有可能吗 当然不是。

所以-什么 可以 做什么?

我们可以从 统计学上证明 ,如果随机数生成器确实均匀分布,则组合(10,10,....,10) 不太可能 。这个概念称为
假设检验
。通过这种方法,我们可以说“具有x%的确定性水平-我们可以拒绝数据取自均匀分布的假设”。

这样做的一种常见方法是使用 Pearson的Chi-
Squared检验

,这个想法与您的相似-填写表格-检查每个单元格 观察到的 (生成的)数目是多少, 预期的
数目是多少空假设下每个像元的数字(在您的情况下,期望值为k/M-,其中M是范围的大小,k是所取数字的总数)。
然后,您可以对数据进行一些操作(有关更多信息,请参阅Wikipedia文章,以了解该操作的确切含义)-并获得一个数字(测试统计量)。然后,您检查此数字是否
可能 来自卡方分布。如果是,则不能拒绝原假设,如果不能,则可以x%的确定性确定数据不是来自统一随机生成器。

编辑: 示例:
您有一个多维数据集,并且要检查它是否“公平”(在中均匀分布[1,6])。将其抛出200次(例如)并创建下表:

number:                1       2         3         4          5          6
empirical occurances: 37       41        30        27         32         33
expected occurances: 33.3      33.3      33.3      33.3       33.3       33.3

现在,根据Pearson的检验,统计量为:

X = ((37-33.3)^2)/33.3 + ((41-33.3)^2)/33.3 + ... + ((33-33.3)^2)/33.3 
X = (18.49 + 59.29 + 10.89 + 39.69 + 1.69 + 0.09) / 33.3
X = 3.9

对于随机C~ChiSquare(5),中较高,则概率3.9~0.45(这不是不可能)1。

因此我们 不能 拒绝原假设,并且可以得出结论,数据 可能 均匀地分布在[1,6]

(1)如果值小于0.05,我们通常会拒绝原假设,但这在很大程度上取决于情况。



 类似资料:
  • 下面要介绍一个在模拟事件和游戏的程序中常用的组件。本节和下节开发一个结构良好、包括多个函数的游戏程序。程序中要使用前面介绍的大多数控制结构。 在赌场上,人人都关心的一个问题就是机会元素(element of chance),也就是赢钱的运气。这个机会元素可以用标准库中的rand函数引入计算机应用程序中。 考虑下列语句: i=rand(); rand 函数产生O到RAND_MAX之间的整数(这是<s

  • 生成随机数 # random_random.py import random for i in range(5): print('%04.3f' % random.random(), end=' ') print() # random_uniform.py import random for i in range(5): print('{:04.3f}'.format(ran

  • 问题 你需要生成在一定范围内的随机数,但你也需要对发生器进行“生成种子”操作来提供可预测的值。 解决方案 编写你自己的随机数生成器。当然有很多方法可以做到这一点,这里给出一个简单的示例。 该发生器绝对不可以以加密为目的! class Rand # 如果没有种子创建,使用当前时间作为种子 constructor: (@seed) -> # Knuth and Lewis' impro

  • random 生成随机数包 文档:https://www.npmjs.com/package/random 安装:npm install --save random 封装代码: app / extend / context.js // 导入 jwt const jwt = require('jsonwebtoken') // 导入随机数包 const random = require('rando

  • 问题 你需要生成在一定范围内的随机数。 解决方案 使用 JavaScript 的 Math.random() 来获得浮点数,满足 0<=X<1.0 。使用乘法和 Math.floor 得到在一定范围内的数字。 probability = Math.random() 0.0 <= probability < 1.0 # => true # 注意百分位数不会达到 100。从 0 到 100 的范围实

  • 问题内容: JavaScript函数返回一个介于0到1之间的随机值,该值会根据当前时间自动播种(我相信类似于Java)。但是,我认为没有任何办法可以为其设置种子。 如何制作一个可以提供自己的种子值的随机数生成器,以使它生成可重复的(伪)随机数序列? 问题答案: 一种选择是http://davidbau.com/seedrandom,它是可播种的基于RC4的Math.random()插入式替换,具有