我很想知道为什么C中的random_number=a+rand()%b;
在a和b之间产生一个随机数(不包括b)。但是在Java中,这段代码不起作用。我知道在Java中执行此操作的正确方法是random_number=a+(Math.random()*(b-a));
,但我很想知道为什么会有区别?数学运算不一样吗?我也明白随机函数的返回类型是不同的,但这种差异如何解释输出的差异?对不起,如果这看起来像一个微不足道的问题,但我很好奇。
答案 0 :(得分:6)
不同之处在于每个随机发生器的作用。
在Java中,Math.Random
通过0
(不包括)返回范围1
(包括)的伪随机数。因此,它必须按b - a
(范围的宽度)进行放大,然后移动a
,即范围的开头。
在C中,rand()
会返回0
到RAND_MAX
范围内的数字(我的RAND_MAX
为32767
),因此使用了%b
控制范围的宽度,范围的开始移动a
。
答案 1 :(得分:2)
当然可以使用java.util.Random的nextInt()
或nextInt(int n)
方法来更准确地模仿C方案。 nextInt()
与rand()
几乎完全相同(虽然希望更好地分发),而nextInt(int n)
有效地包含%n
计算。
答案 2 :(得分:0)
在java中,它是nextInt()
int nextInt(int n)
此函数返回0到n之间的随机数
在C中,它是rand()
int rand(void)
此函数返回介于0和RAND_MAX之间的整数值。