- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 Josh 给出的有缺陷的随机方法的示例中,该方法生成具有给定上限 n
的正随机数,我不明白他所说的两个缺陷。
书中的方法是:
private static final Random rnd = new Random();
//Common but deeply flawed
static int random(int n) {
return Math.abs(rnd.nextInt()) % n;
}
Random.nextInt()
的文档说 从这个随机数生成器的序列中返回下一个伪随机、均匀分布的 int 值。
所以如果 n 是小整数,那么序列会重复,为什么这只适用于 2 的幂?Random.nextInt()
生成均匀分布的随机整数,为什么会出现这种情况? (他提供了一个代码片段,清楚地证明了这一点,但我不明白为什么会这样,以及这与 n 是 2 的幂有什么关系)。最佳答案
Question 1: if n is a small power of 2, the sequence of random numbers that are generated will repeat itself after a short period of time.
这不是乔希所说的任何事情的必然结果;相反,它只是 linear congruential generators 的已知属性。 .维基百科有以下说法:
A further problem of LCGs is that the lower-order bits of the generated sequence have a far shorter period than the sequence as a whole if m is set to a power of 2. In general, the n-th least significant digit in the base b representation of the output sequence, where bk = m for some integer k, repeats with at most period bn.
这在 Javadoc 中也有说明。 :
Linear congruential pseudo-random number generators such as the one implemented by this class are known to have short periods in the sequence of values of their low-order bits.
函数的另一个版本,Random.nextInt(int)
,在这种情况下通过使用不同的位来解决这个问题(强调我的):
The algorithm treats the case where n is a power of two specially: it returns the correct number of high-order bits from the underlying pseudo-random number generator.
这是选择 Random.nextInt(int)
而不是使用 Random.nextInt()
并进行自己的范围转换的一个很好的理由。
Question 2: Next he says that if n is not a power of 2, some numbers will be returned on average more frequently than others.
nextInt()
可以返回 232 个不同的数字。如果您尝试使用 % n
将它们放入 n 个存储桶中,并且 n 不是 2 的幂,则某些存储桶的数量会比其他存储桶多。这意味着即使原始分布是均匀的,某些结果也会比其他结果更频繁地发生。
让我们用小数来看看这个。假设 nextInt()
返回四个等概率结果,0、1、2 和 3。让我们看看如果我们将 % 3
应用于它们会发生什么:
0 maps to 0
1 maps to 1
2 maps to 2
3 maps to 0
如您所见,该算法返回 0 的频率是返回 1 和 2 的频率的两倍。
当 n 是 2 的幂时,不会发生这种情况,因为一个 2 的幂可以被另一个整除。考虑 n=2
:
0 maps to 0
1 maps to 1
2 maps to 0
3 maps to 1
在这里,0 和 1 以相同的频率出现。
其他资源
以下是一些与 LCG 相关的额外资源(如果只是切线相关):
关于java - 有效 Java 项目 47 : Know and use your libraries - Flawed random integer method example,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27779177/
我遇到了一个奇怪的问题。我有这个: $(document).ready(function () {
我正在编写一个程序,它从列表中读取一些 ID,从中找出不同的 URL,然后将图像保存到我的 C: 驱动器中。 如果我在浏览器中导航到图像 URL,它们就会起作用。此外,如果我尝试从不同的服务器获取图像
我编写了一个 REST WCF RIA Silverlight 4.0 兼容服务,我可以从 javascript + jQuery.1.4.2.js + JSON2.js(当然,还可以从 .NET 4
我很确定这个网站实际上还没有得到回答。一劳永逸地,与 32 位有符号整数范围内的数字字符串匹配的最小正则表达式是什么,范围是 -2147483648至 2147483647 . 我必须使用正则表达式进
我有两个data.table;我想从那些与键匹配的元素中随机分配一个元素。我现在这样做的方式相当慢。 让我们具体点;这是一些示例数据: dt1<-data.table(id=sample(letter
我已经安装了 celery 、RabitMQ 和花。我可以浏览到花港。我有以下简单的工作人员,我可以将其附加到 celery 并从 python 程序调用: # -*- coding: utf-8 -
我正在使用 ScalaCheck 在 ScalaTest 中进行一些基于属性的测试。假设我想测试一个函数,f(x: Double): Double仅针对 x >= 0.0 定义的, 并返回 NaN对于
我想检查文件是否具有有效的 IMAGE_DOS_SIGNATURE (MZ) function isMZ(FileName : String) : boolean; var Signature: W
在 Herbert Schildt 的“Java:完整引用,第 9 版”中,有一个让我有点困惑的例子。它的关键点我无法理解可以概括为以下代码: class Test { public stat
我在工作中查看了一些代码,发现了一些我以前没有遇到过的东西: for (; ;) { // Some code here break; } 我们一直调用包含这个的函数,我最近才进去看看它是
在 Herbert Schildt 的“Java:完整引用,第 9 版”中,有一个让我有点困惑的例子。它的关键点我无法理解可以概括为以下代码: class Test { public stat
我试图编写一个函数,获取 2D 点矩阵和概率 p 并以概率 p 更改或交换每个点坐标 所以我问了一个question我试图使用二进制序列作为特定矩阵 swap_matrix=[[0,1],[1,0]]
这个问题在这里已经有了答案: Using / or \\ for folder paths in C# (5 个答案) 关闭 7 年前。 我在某个Class1中有这个功能: public v
PostgreSQL 10.4 我有一张 table : Column | Type ------------------------- id | integer| title
我正在 Postgresql 中编写一个函数,它将返回一些针对特定时区(输入)计算的指标。 示例结果: 主要问题是这只是一个指标。我需要从其他表中获取其他 9 个指标。 对于实现此目标的更简洁的方法有
我需要在 python 中模拟超几何分布(用于不替换采样元素的花哨词)。 设置:有一个装满人口许多弹珠的袋子。弹珠有两种类型,红色和绿色(在以下实现中,弹珠表示为 True 和 False)。从袋子中
我正在使用 MaterializeCSS 框架并动态填充文本输入。我遇到的一个问题是,在我关注该字段之前,valid 和 invalid css 类不会添加到我的字段中。 即使我调用 M.update
是否有重叠 2 个 div 的有效方法。 我有以下内容,但无法让它们重叠。 #top-border{width:100%; height:60px; background:url(image.jpg)
我希望你们中的一位能向我解释为什么编译器要求我在编译单元中重新定义一个静态固定长度数组,尽管我已经在头文件中这样做了。这是一个例子: 我的类.h: #ifndef MYCLASS_H #define
我正在使用旧线程发布试图解决相同问题的新代码。什么是安全 pickle ? this? socks .py from socket import socket from socket import A
我是一名优秀的程序员,十分优秀!