关于random(x)和random()%x的数学问题-Java
所以我的问题是Java,但它可以是任何编程语言。 声明如下:关于random(x)和random()%x的数学问题-Java,java,math,Java,Math,所以我的问题是Java,但它可以是任何编程语言。 声明如下: Random rnd = new Random(); 我们想得到一个0到x范围内的随机数 我想知道以下各项之间是否存在数学上的差异: rnd.nextInt() % x; 及 主要问题是,这些解决方案中的一个比另一个更随机吗?一种解决方案比另一种更合适或“正确”吗?如果它们相等,我将很高兴看到它的数学证明newrandom(x)只是用给定的种子创建了Random对象,它不会自行生成随机值 我想你是在问nextInt()%x和nex
Random rnd = new Random();
我们想得到一个0到x范围内的随机数
我想知道以下各项之间是否存在数学上的差异:
rnd.nextInt() % x;
及
主要问题是,这些解决方案中的一个比另一个更随机吗?一种解决方案比另一种更合适或“正确”吗?如果它们相等,我将很高兴看到它的数学证明newrandom(x)
只是用给定的种子创建了Random
对象,它不会自行生成随机值
我想你是在问nextInt()%x
和nextInt(x)
之间有什么区别
区别如下
nextInt(x)
nextInt(x)
生成一个随机数n,其中0≤ nnextInt()%x
nextInt()%x
生成一个整数范围为1的随机数,然后应用模x。整个整数范围包括负数,因此结果也可能是负数。换句话说,范围是−xnextInt()
有232种可能性,但是,为了简单起见,让我们假设它有24=16种可能性,并且我们选择x不是16或更大。假设x是10
所有的可能性都是0,1,2,…,14,15,16。应用模10后,结果为0、1、2、3、4、5、6、7、8、9、0、1、2、3、4、5这意味着某些数字比其他数字发生的可能性更大。这也意味着某些数字发生两次的变化增加了
正如我们所看到的,nextInt()%x
有两个问题:
1根据。欢迎使用“MS Paint”收听“数学洞察力”
因此,从统计角度来看,这将取决于生成的数字的分布。首先,我们将把任何一个数字出现的概率视为一个独立事件(也称为丢弃种子,即RNG,等等)。然后,模数只是从
N
中取一系列数字(例如a
),其中0
您所说的“更多选项”是什么意思?使用%
具有更差的统计特性。我的讲师声称,如果我们想要一个从0到100的数字,使用模有更多的选项在同一个数字中不会两次损坏。我声称这不是真的,我正在寻找一种方法来证明它。或者我错了。为了帮助说明问题,让我们使用较小的数字空间,例如,让我们假设nextInt()
实际返回的是byte
值。在这种情况下,nextInt()
(无arg)返回范围-128
到127
的数字,因此如果x=100
,nextInt()%x
将返回-99
到99
,并且-28
和27
之间的数字是其余数字的两倍。相比之下,nextInt(x)
将返回0
到99
,所有数字的可能性相同。结论:你的老师大错特错了,当使用%
时,获得相同数字两次的机会增加了,而且数字甚至不在相同的范围内。为什么会关闭?这个问题可能不完美,但有足够的理由继续讨论写一个答案。我支持安德烈亚斯的结论,即老师完全错了:如果没有一个具有统一概率分布的随机数生成器,你将很难证明它不会导致问题复杂化。更不用说如果N%N>0
,那么N
中的任何a
都更有可能朝向la%n
rnd=new Random(x);
创建一个新的随机数生成器对象。rnd.nextInt()%x;
使用此随机数生成器。我不会使用%(余数)操作符,而是使用rnd.nextInt(x)。
rnd.nextInt(x)