首页 / 知识
关于数学:如何测试随机性(以点为例-改组)
2023-04-14 23:18:00

How to test randomness (case in point - Shuffling)首先,从这个问题中剔除掉这个问题。我这样做是因为我认为这部分内容比一个较长问题的子部分要大。如果冒犯了,请原谅我。
假设您有一个生成随机性的算法。现在如何测试?
为该问题添加一些理论- 改组后,您有机会获得序列中每个西装的A,K,Q,J ...的机会是什么?回答1/52! 因此,仅洗牌一次并查看结果绝对不会给您关于洗牌算法随机性的任何信息。您有两次获得更多信息,甚至还有三个... 黑匣子将如何测试混洗算法的随机性? 统计。测试RNG的事实标准是Diehard套件(最初可从http://stat.fsu.edu/pub/diehard获得)。另外,Ent程序提供的测试更易于解释,但不全面。 至于混排算法,请使用众所周知的算法,例如Fisher-Yates(也称为" Knuth Shuffle")。只要基础RNG是一致随机的,则随机播放将是一致随机的。如果您使用的是Java,则该算法在标准库中可用(请参阅Collections.shuffle)。 对于大多数应用程序来说,这可能无关紧要,但是请注意,大多数RNG不能提供足够的自由度来生成52张卡片组的所有可能排列(在此进行解释)。 这是您可以执行的一项简单检查。它使用生成的随机数来估计Pi。这不是随机性的证明,但是劣质的RNG通常在其上效果不佳(它们将返回2.5或3.8而不是?3.14的值)。 理想情况下,这只是您要检查随机性的众多测试之一。 您可以检查的其他内容是输出的标准偏差。范围为0..n的值的均匀分布总体的预期标准偏差接近n / sqrt(12)。
首先,不可能确定某个有限的输出是否是"真正随机的",因为正如您指出的那样,任何输出都是可能的。 可以做的是获取一个输出序列,并对照该可能性检查该序列的各种度量。您可以得出一种可信度分数,表明生成算法正在做得很好。 例如,您可以检查10种不同混洗的输出。为每张卡分配一个数字0-51,并在随机播放中将位置6的卡平均。收敛平均值为25.5,因此您会惊讶地看到此处的值为1。您可以使用中心极限定理来估计给定位置的每个平均值的可能性。 但是我们不应该在这里停下来!因为该算法可能会被仅在两个随机播放之间交替的系统欺骗,该随机播放被设计为每个位置的平均准确度为25.5。我们如何做得更好? 我们希望每个位置在不同的洗牌中分布均匀(对于任何给定的纸牌,可能性均等)。因此,在10个改组中,我们可以尝试验证选择是否"看起来一致"。这基本上只是原始问题的简化版本。您可以检查标准偏差看起来是否合理,最小值是否合理以及最大值也是如此。您还可以检查其他值是否有意义,例如最近的两张卡(按我们分配的编号)。 但是我们也不能随便添加这种无穷大的度量,因为如果有足够的统计数据,那么由于某种原因,任何特定的混洗都将不太可能出现(例如,这是极少数混洗中的卡片X,Y,Z出现在其中的一种)订购)。因此,最大的问题是:应该采取哪些正确的测量方法?在这里,我不得不承认我不知道最佳答案。但是,如果您有一个特定的应用程序,则可以选择一组好的属性/度量进行测试,然后使用它们进行测试-这似乎是密码学家处理事物的方式。 关于测试随机性有很多理论。对于卡改组算法的非常简单的测试,您可以进行大量混洗,然后运行卡方检验,以确保每张卡在任何位置翻身的概率都是均匀的。但这不能测试连续的卡是否没有关联,因此您也想对此进行测试。 Knuth的计算机编程艺术第2卷提供了许多测试,您可以在3.3.2节(经验测试)和3.3.4节(频谱测试)中使用这些测试及其背后的理论。 测试随机性的唯一方法是编写一个程序,该程序尝试为被测试的数据建立预测模型,然后使用该模型尝试预测未来的数据,然后证明其预测的不确定性或熵随着时间的流逝趋向于最大化(即均匀分布)。当然,您将始终不确定模型是否已捕获所有必要的上下文。在给定模型的情况下,始终可以构建第二个模型,该模型生成对第一个看起来随机的非随机数据。但是,只要您接受冥王星的轨道对改组算法结果的影响微不足道,那么您应该能够使自己确信其结果是可以接受的随机性。 当然,如果执行此操作,则最好也使用模型来实际创建所需的数据。如果这样做,那么您将回到第一广场。 随机播放许多,然后记录结果(如果即时通讯正确阅读)。我记得看到过"随机数生成器"的比较。他们只是一遍又一遍地测试它,然后绘制结果图。 如果它确实是随机的,则该图将大部分为偶数。 为了进行快速测试,您可以随时尝试对其进行压缩。一旦它不压缩,就可以进行其他测试。 我已经尝试过顽固的尝试,但是它拒绝改组工作。所有测试均失败。它也确实很笨拙,它不会让您指定所需的值范围或类似的内容。 到目前为止还没有代码,因此我将答案中的测试部分复制粘贴到原始问题中。
此代码不测试基础伪随机数生成器的随机性。测试PRNG随机性是科学的整个分支。 测试52!可能性当然是不可能的。取而代之的是,在3、5和10等较小数量的卡片上尝试随机播放。然后,您可以测试数十亿次随机播放,并使用直方图和卡方统计检验来证明每个排列正好是一个"偶数"数字的时间。 我没有完全关注你的问题。你说
你什么意思?如果您假设可以产生随机性,则无需进行测试。 一旦有了一个好的随机数生成器,就可以轻松地创建一个随机排列(例如,将您的卡片称为1-52。生成52个随机数,依次将每个数字分配给一张卡片,然后根据您的52个随机数进行排序)。您不会通过生成排列来破坏好的RNG的随机性。 困难的问题是您是否可以信任RNG。这是一个示例链接,可让人们在特定环境下讨论该问题。 我自己考虑一下,我会做的事情是这样的: 设置(伪代码)
这为我们提供了一个矩阵52x52,该矩阵指示一张卡在特定位置结束的次数。重复很多次(我将从1000开始,但是统计能力强于我的人可能会得出更好的数字)。 分析矩阵 如果我们具有完美的随机性,并且可以无限制地执行随机播放,那么对于每张卡和每个位置,该卡在该位置结束的次数与任何其他卡相同。用不同的方式说同一件事:
因此,我将计算出距该数字还有多远。 |
最新内容
相关内容
linux修改组id命令?
linux修改组id命令?,系统,工具,信息,用户组,情况,名字,管理,软件,文件,分区,linux中只能修改文件的组属性使用哪条命令1、将文件用户组改为rooPython3实现旋转数组的3种算法
Python3实现旋转数组的3种算法,位置,代码,时间,培训,算法,数组,解法,结果,长度,索引,下面是Python3实现的旋转数组的3种算法。一、题目给定一Python算法是什么?有哪几类?
Python算法是什么?有哪几类?,数据,数字,时间,算法,系统,策略,位置,有限,标准,培训,了解Python的人应该都听说过Python算法,但是它们的类型和定义Python编程中3个常用的数据结构和
Python编程中3个常用的数据结构和算法,代码,电话号码,销售额,有限,情况,分解,异常,名称,平均,位置,python内置了许多非常有用的数据结构,比如Python机器学习之AdaBoost算法
Python机器学习之AdaBoost算法,数据,综合,失衡,时间,培训,算法,样本,权重,模型,机器,算法概述AdaBoost是英文AdaptiveBoosting(自适应增强)的Python算法定义
Python算法定义,有限,时间,数据,算法,情况,培训,系统,策略,复杂度,步骤,算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的python RSA加密算法过程
python RSA加密算法过程,数据,工作,公开,指数,第一,公式,基础,时间,培训,因子,1,随机选取两个质数p和q2,计算n=pq3,选取一个与Ø(n)互质的小奇数Python 决策树算法思想
Python 决策树算法思想,标准,数据,节点,量化,技术,衍生,信息,连续,培训,叶子,决策树(decisiontree)是一个树结构(可以是二叉树或者非二叉树)Python 决策树的生成算法介绍
Python 决策树的生成算法介绍,信息,数据,量化,标准,算法,增益,培训,衍生,准则,情况,划分数据集的最大原则是:使无序的数据变的有序。如果一个基于 Python K-近邻算法的手写识别
基于 Python K-近邻算法的手写识别系统,数据,数字,分析,培训,系统,算法,近邻,测试,样本,图形,这里我们一步步的构造使用k-近邻分类器的手写识Python k-近邻算法常见问题
Python k-近邻算法常见问题,加权,技术,系统,培训,样本,近邻,距离,变量,算法,权重,1,K值设定为多大?K太小,分类结果易受噪声点影响;K太大,近邻中Python k-近邻算法的实现原理
Python k-近邻算法的实现原理,数据,样本,分析,收费,时间,流程,培训,算法,子树,近邻,1.KNN算法流程步骤(1)收集数据:可以使用任何方法。包括爬