寻找一个清晰简洁的网页来解释为什么随机数的较低位通常不是那么随机

2023-12-03

我正在整理一个内部“每个开发人员都应该知道”的 wiki 页面。

我看到很多关于rand() % N,但没有一个网页可以解释这一切。

例如,我很好奇这个问题是否仅特定于 C 和 Linux,或者是否也适用于 Windows、C++。 Java、.Net、Python、Perl。

请帮我查清真相。另外,这些数字的非随机性到底有多大?谢谢你!


我没有可供您参考的网页,但我可能有一个“信封背面”的解释会有所帮助。简单随机数生成器的工作方式是按照以下步骤操作

  1. 使用最后生成的数字n或种子号。
  2. 将该数字乘以一个特殊的大数
  3. 添加另一个特殊的大数
  4. 将其除以第三个特殊大数并丢弃余数
  5. 返回结果

现在,如果您考虑除第 4 步之外的所有步骤中发生的情况,那么您正在执行的操作中,只有较低位可以更改结果的较低位。将 1001 和 100...00001 相加将以 ...02 结尾(哈,虽然我说的是基数 2,但实际上这些数字是基数 12 咯咯笑。)无论计算的高端是什么。同样,当你相乘时,无论如何它都会以 1 结尾。

在高端也存在类似的问题,十亿乘以十亿总是会主导数百位凋零数的贡献。这表明中间是好事发生的地方。许多位在这里相互作用——高、中、低。

这就是除法步骤的目的,它切断了结果的底部部分,那里没有太多的交互。顶部块通常不会被截断,因为当乘法不再适合机器字时,计算机会丢弃高位。

最后,尽管截断点有些任意,你可能比设计算法的人更挑剔,但仍然会截断更多位。

对于你的问题,他们可能有多糟糕,他们可能真的很糟糕。看到这一点的最简单方法是将单个数字分组为元组并绘制它们的图表。所以如果你有随机数a, b, c, d, ... graph (a,b), (c,d), ...并查看结果。这被称为频谱测试,兰德完美地通过了它。这个我有一个尝试的链接http://random.mat.sbg.ac.at/results/karl/spectraltest/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

寻找一个清晰简洁的网页来解释为什么随机数的较低位通常不是那么随机 的相关文章

  • 是否可以证明序列是否是随机的?

    考虑以下输入 1 1 2 3 5 8 这不是随机的 2 4 8 16 32 这都不是 4 1 2 11 5 9 这个看起来像随机序列 我想问是否有这样的算法来证明输入是否是随机的 不 没有这样的证明 如果你有完全随机的数字 则每个长度为 n
  • 在 Golang 中生成固定长度的随机十六进制字符串的有效方法?

    我需要生成很多固定长度的随机十六进制字符串 我找到这个解决方案golang中如何生成固定长度的随机字符串 https stackoverflow com a 31832326 710955 我正在做这样的事情 const letterByt
  • C++ - 生成遵循范围内正态分布的随机数

    我需要生成遵循正态分布的随机数 该数应位于 1000 到 11000 的区间内 平均值为 7000 我想使用C 11库函数 http www cplusplus com reference random normal distributio
  • 如何在C++11中让每个线程使用自己的RNG

    我正在 C 11 中使用新的随机数生成器 虽然有不同的看法 但由此看来thread https stackoverflow com questions 8813592 c11 thread safety of random number g
  • 随机字符串生成器产生相同结果的问题

    我使用随机字符串生成器 基于此 http stackoverflow com questions 1344221 how can i generate random 8 character alphanumeric strings in c
  • Java:用于标志检查的位运算

    我试图检查一个数字是否有第二位标志 即 0000 0010 我的代码如下 int flags Integer parseInt fields 1 String strflags Integer toBinaryString flags fl
  • 在 C 或 C++ 中用 1 到 10^10 之间的随机数填充数组

    我的分配的一部分基于一个数组 其大小由用户指定 其中包含从 1 到 10 10 的随机数 然后我们必须找到数组中第 k 个较小的数字 这是我尝试过的 include
  • REST - 获取随机数 GET 还是 POST?

    应该如何在 REST 中正确实现随机数生成器 GET RANDOM or POST RANDOM 服务器每次返回不同的随机数 我可以看到这两种方式的论点 我想说这与返回的包含当前时间的页面相同 其中许多都是使用 GET 完成的 抽象地说 获
  • 在 JavaScript 中生成 UUID 时发生冲突

    这涉及到这个问题 https stackoverflow com questions 105034 how to create a guid uuid in javascript 我正在使用下面的代码这个答案 https stackover
  • 创建一个具有相同定义域和值域的随机双射函数

    创建一个具有相同定义域和值域的随机双射函数 我所说的随机双射函数是指使用随机算法 或至少是伪随机算法 将元素从域映射到范围的函数 而不是像 x y 这样的函数 域和范围有时可能是一个非常小的集合 例如 1 2 3 4 5 因此配对函数将不起
  • suhosin.mt_srand.ignore 在 PHP 中一致洗牌数组的解决方法?

    我有一个 PHP 脚本 需要随机化一个具有一致结果的数组 这样它就可以向用户呈现前几个项目 然后如果他们愿意 他们可以从同一个打乱的集合中提取更多结果 我目前使用的是这个 基于我相信的 Fisher Yates 算法 function sh
  • 使用 BinaryWriter 将一位写入二进制文件

    我想将一位写入二进制文件 using FileStream fileStream new FileStream myfile bin FileMode Create using BinaryWriter binaryWriter new B
  • 从排列生成器中随机选择?

    如何随机挑选所有结果 一一 不重复 itertools permutations k 或者这个 如何构建随机排列生成器 就像是shuffle permutations k 我正在使用Python 2 6 Yeah shuffle r 可以使
  • 绕过 dev/urandom|random 进行测试

    我想编写一个功能测试用例 用已知的随机数值来测试程序 我已经在单元测试期间用模拟对其进行了测试 但我也希望用于功能测试 当然不是全部 最简单的方法是什么 dev urandom仅覆盖一个进程 有没有办法做类似的事情chroot对于单个文件并
  • 生成大随机数 php [重复]

    这个问题在这里已经有答案了 我想使用 PHP 生成一个包含 75 个字符的数字 我到处寻找 但一无所获 除了这个 http dailycoding com tools RandomNumber aspx http dailycoding c
  • MYSQL从每个类别中随机选择一条记录

    我有一个数据库Items表看起来像这样 id name category int 有几十万条记录 每个item可以是 7 种不同的之一categories 对应于categories table id category 我想要一个从每个类别
  • 加到 100 的随机数:Matlab

    我将人口数量分成不同的矩阵 现在想使用随机数测试我的代码 快速提问 谢谢你们提前的帮助 如果我使用 100 rand 9 1 使这 9 个数字相加等于 100 的最佳方法是什么 我想要 9 个 0 到 100 之间的随机数 加起来为 100
  • 尽管设置了随机状态和相同的输入,sklearn RandomForestClassifier.fit() 仍不可重现

    在使用 Scikit learn 调整随机森林模型时 我注意到即使我使用相同的 RandomForestClassifier 实例和相同的数据作为输入 但在不同的运行后其准确度分数也不同 我尝试了谷歌搜索和 stackExchange 搜索
  • 如何计算整数中零位的数量?

    我将如何找到 C 中 零 位的数量 假设我有一个整数 int value 276 我有位 100010100 但是如何计算零呢 如果你想要效率 那么 Hackers Delight 一书中有一个很好的实现 22条指令无分支 unsigned
  • 给定每个项目的概率,从列表中选择随机项目

    抱歉标题措辞不好 我有一个名为 NGram 的对象 class NGram other properties double Probability get set Value between 1 and 0 现在假设我有这些对象的列表 以便

随机推荐