2013-09-30 108 views
0

我很想知道C中的random_number=a+rand()%b;为什么会产生a和b之间的随机数(不包括b)。但在Java中,这个代码不起作用。我知道在Java中这样做的正确方法是random_number=a+(Math.random()*(b-a));,但我很想知道为什么会有差异?数学上的运算不一样吗?我也明白,随机函数的返回类型是不同的,但是这种差别是如何解释输出的差异呢?对不起,如果这似乎是一个微不足道的问题,但我很好奇。C与Java中的随机数生成

+9

为什么'Java'与'C'完全不一样? –

+5

'rand'在'0'和'RAND_MAX'之间生成一个整数。 'Math.random'在'0'和'1'之间生成一个双精度值。因此,不同的表达。顺便说一句,'a + rand()%b'在'a'和'a + b'(不包含)之间生成一个随机数。你打算写'a + rand()%(b-a)'。 –

+0

'a + rand()%b'不起作用。也许你正在想'a + rand()%(b-a)'。此外,C rand()返回一个随机整数,而Java Math.random()返回介于0和1之间的float。 –

回答

6

区别在于每个随机生成器的作用。

在Java中,Math.Random返回范围0(含)至1(不含)的伪随机数。所以它必须按照范围的宽度b - a放大,然后移动a,范围的开始。在范围0

在C中,rand()返回编号,以RAND_MAX(我的RAND_MAX32767),所以%b用于控制的范围内的宽度,并且该范围的开始是由a移位。

2

当然可以使用java.util.Random的nextInt()nextInt(int n)方法来更精确地模仿C方案。 nextInt()几乎与rand()(尽管希望更好地分发)完全相同,而nextInt(int n)实际上包含%n计算。

0

在java中它是nextInt()

int nextInt(int n) 

此功能0之间至n

返回随机数在C它是rand()

int rand(void) 

该函数返回0到RAND_MAX之间的整数值。