Arc4随机模偏置

2024-04-25

根据本文档 https://developer.apple.com/library/mac/documentation/darwin/reference/manpages/man3/arc4random.3.html,

arc4random_uniform()推荐使用类似的结构arc4random() % upper_bound因为当上限不是 2 的幂时,它可以避免“模偏差”。

偏见有多严重?例如,如果我生成上限为 6 的随机数,那么使用arc4random with % and arc4random_uniform()?


arc4random() 返回一个无符号 32 位整数,这意味着值介于 0 和 2^32-1 = 4 294 967 295。

现在,偏差是由以下事实造成的:使用以下命令创建的多个子区间 模数不完全适合随机输出范围。 为了清楚起见,让我们想象一个随机生成器,它创建 0 到 198 之间的数字 包括的。您想要 0 到 99 之间的数字,因此您计算 random() % 100, 产生 0 到 99:

0 % 100 = 0
99% 100 = 99
100% 100 = 0
198% 100 = 98

你看99是唯一一个只能出现的数字once虽然所有 其他可能发生twice在跑步中。这意味着 99 的概率 正好减半,这也是偏差中最坏的情况,其中至少 涉及2个子区间。
由于小于范围间隔的所有二的幂都很好地适合 2^32 间隔,在这种情况下偏差消失。

这意味着模数结果集越小且越高 随机输出范围越大,偏差越小。在你的例子中,6是你的上限 界(我假设 0 是下界),所以你使用 % 7,结果是 0-3 出现 613 566 757 次,而 4-6 出现 613 566 756 次。
所以 0-3 的可能性是 613 566 757 / 613 566 756 = 1.0000000016298 倍 比4-6。

虽然这似乎很容易被忽视,但一些实验(尤其是蒙特卡洛实验) 实验)之所以有缺陷,正是因为这些看似令人难以置信的小 差异非常重要。

如果所需的输出范围是,更糟糕的是偏差bigger比 随机目标范围。请阅读费舍尔-耶茨洗牌 https://en.wikipedia.org/wiki/Fisher-Yates_shuffle入口 因为许多扑克网站都经历过惨痛的教训才知道正常的线性 同余的随机生成器和糟糕的洗牌算法导致 不可能的或非常可能的牌组或更糟的牌组,可预测 decks.

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

Arc4随机模偏置 的相关文章

随机推荐

  • 为什么没有像 ruby​​ 的 capybara for java 这样的无头 BDD 测试引擎?

    为什么没有 java 版本的 ruby capybara https github com jnicklas capybara https github com jnicklas capybara 这可以与 tomcat 或其他东西一起使用
  • 如何在 PyGame 中加载多个图像?

    我需要在 pygame 中加载大约 200 个图像 以便在游戏中的各个点进行位块传输 我尝试为此编写一个函数 但总是回来NameError name tomato is not defined 所有图像名称都是加载图像的变量存储的名称 to
  • 设置分组条形图之间的间距

    我正在尝试按照图库中的示例在 matplotlib 中制作分组条形图 我使用以下内容 import matplotlib pyplot as plt plt figure figsize 7 7 dpi 300 xticks 0 1 1 1
  • 本地播放 mp3 时 Android MediaPlayer 错误(1, -2147483648)

    Android 4 4 发布后不久 我的代码自 2 2 以来一直正常工作 突然出现了错误 我的代码将查询音乐数据库中给定的音乐文件 该路径在查询中返回 然后该路径被传递到 MediaPlayer Code String uri conten
  • 在reactjs中以编程方式取消选中复选框

    我正在弄乱复选框 我想知道有没有一种方法可以通过调用函数来取消选中单击按钮时的复选框 如果是这样 我怎样才能做到这一点
  • 实现类 Markdown 语言的解析器

    我有类似于 markdown 和 SO 使用的标记语言 遗留解析器基于正则表达式 维护起来简直是噩梦 因此我提出了自己的基于 EBNF 语法的解决方案 并通过 mxTextTools SimpleParse 实现 但是 某些令牌可能存在相互
  • CMake 64 位和 SFML 64 位

    我正在尝试使用适用于 Windows 的 CMake 64 位和 SFML 2 5 1 64 位构建 C 项目 当我在项目上运行 cmake 时 我收到一条错误消息 我能让它工作的唯一方法是改变CMAKE PREFIX PATH指向 SFM
  • 读取请求正文两次

    我试图读取中间件中的主体以进行身份 验证 但是当请求到达 api 控制器时 对象为空 因为主体已被读取 有没有办法解决 我在中间件中像这样读取正文 var buffer new byte Convert ToInt32 context Re
  • 如果图像比其容器宽,如何将图像居中?

    通常 您将图像居中display block margin auto 但如果图像比容器大 则会向右溢出 如何使其均匀地向两侧溢出 容器的宽度是固定且已知的 图像的宽度未知 纯CSS解决方案 需要一个额外的包装器 在 FireFox IE8
  • 不同数据类型的内存对齐方式是否不同

    在C中执行不同的数据类型 例如char short int long float double有不同的内存对齐边界吗 在 32 位字对齐字节可寻址操作系统中 如何访问char or short与访问不同int or float 在这两种情况
  • html5在移动设备中自动播放视频

    Auto play is not working without muted attribute when I try to open url in mobile device How to play video without using
  • PreLoader 的多线程 - JavaFX

    我正在开发一个 JavaFX 应用程序 需要在启动主应用程序阶段之前从文件中加载资源 我完成此任务的解决方案是使用 PreLoader 以便用户在加载资源之前无法与应用程序交互 非常标准的东西 我有一个扩展 PreLoader 类的类 该类
  • 有没有办法从 VS2010 中的建模项目生成代码?

    有没有办法从 VS2010 中的建模项目生成代码 看来这个功能即将到来 但 Beta2 中还没有 微软的拉梅什 拉贾戈帕尔回答类似的问题 http social msdn microsoft com Forums en US vstspre
  • 如何将回车符作为字符添加到文件中?

    我想要一个像这样的字符串 blablbabla
  • Flexbox,保持纵横比的方形 div 的响应式网格

    我正在尝试用 div 创建一个 2x2 网格 某些 div 可能包含图像 但它可能会被设置为背景 并带有选项background size cover 这是我创建的笔 http codepen io qarlo pen vLEprq htt
  • 如何使用 Arquillian Weld EE Embedded 测试 EJB 方法调用

    我想测试 EJB 并且想使用 Weld EE Embedded 来测试它 因为我不想为此部署应用程序服务器 这是我的课程 RunWith Arquillian class public class EJBTest Deployment pu
  • 将 Sql Server 与 Django 2.0 结合使用

    我想将 Django 2 0 与旧版 MS SQL Server 数据库一起使用 我能找到的有关使用 Django 与 MS SQL Server 的最新信息是在生产中使用 Sql Server 和 Django 这些天 https sta
  • Java 线程转储:阻塞线程而不“等待锁定...”

    我很难理解从 jstack 获得的 Tomcat 6 java 1 6 0 22 Linux 上运行的 Spring MVC Web 应用程序的线程转储 我看到阻塞线程 导致其他线程等待 本身被阻塞 但是线程转储并没有告诉我原因或它们正在等
  • removeEventListener 的行为

    请检查以下代码 var clickfn function alert clicked document getElementById div1 addEventListener click clickfn true clickfn func
  • Arc4随机模偏置

    根据本文档 https developer apple com library mac documentation darwin reference manpages man3 arc4random 3 html arc4random un