关于random(x)和random()%x的数学问题-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

所以我的问题是Java,但它可以是任何编程语言。 声明如下:

Random rnd = new Random();
我们想得到一个0到x范围内的随机数

我想知道以下各项之间是否存在数学上的差异:

rnd.nextInt() % x;

主要问题是,这些解决方案中的一个比另一个更随机吗?一种解决方案比另一种更合适或“正确”吗?如果它们相等,我将很高兴看到它的数学证明

newrandom(x)
只是用给定的种子创建了
Random
对象,它不会自行生成随机值

我想你是在问
nextInt()%x
nextInt(x)
之间有什么区别

区别如下

nextInt(x)
nextInt(x)
生成一个随机数n,其中0≤ n
nextInt()%x
nextInt()%x
生成一个整数范围为1的随机数,然后应用模x。整个整数范围包括负数,因此结果也可能是负数。换句话说,范围是−x 此外,在大多数情况下,分布并不均匀
nextInt()
有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
有两个问题:

  • 范围不符合要求
  • 分布不均
  • 因此,您应该在此处明确使用nextInt(int-bound)。如果要求是“仅获取唯一编号”,则必须排除已从编号生成器中提取的编号。另见


    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
    都更有可能朝向l
    a%n
    rnd=new Random(x);
    创建一个新的随机数生成器对象。
    rnd.nextInt()%x;
    使用此随机数生成器。我不会使用%(余数)操作符,而是使用rnd.nextInt(x)。
    rnd.nextInt(x)