Math.random()在Java中到底是如何工作的?

Math.random()在Java中到底是如何工作的?,java,Java,我最近遇到了 数学,随机 用Java编写的类。我想知道这门课的情况。例如,我正在尝试编写一个骰子游戏,每个骰子需要1到6个随机数字。这就是数学随机性的用武之地。这行代码: int random_num = (int) (Math.random() * 6) + 1; 可以生成1到6之间的随机数 我的问题在于 (Math.random() * 6) 在这里 我知道这段代码是如何工作的,Math.random如何生成0.0到1.0之间的双精度值。它是如何乘以6,最后被四舍五入的 然而,我感到困惑

我最近遇到了

数学,随机

用Java编写的类。我想知道这门课的情况。例如,我正在尝试编写一个骰子游戏,每个骰子需要1到6个随机数字。这就是数学随机性的用武之地。这行代码:

int random_num = (int) (Math.random() * 6) + 1;
可以生成1到6之间的随机数

我的问题在于

(Math.random() * 6)
在这里

我知道这段代码是如何工作的,Math.random如何生成0.0到1.0之间的双精度值。它是如何乘以6,最后被四舍五入的

然而,我感到困惑,为什么一个随机数(0.78396954122乘以6)会变成一个介于1到6之间的随机数。假设随机数0.78396954122乘以6,总是6,对吗?2.78396954122不可能突然出现

我在Java是一个彻头彻尾的新手,如果你能帮我解释一下,我将不胜感激

提前谢谢你

然而,我感到困惑,为什么一个随机数(0.78396954122乘以6)会变成一个介于1到6之间的随机数。假设随机数0.78396954122乘以6,总是6,对吗

0.78396954122*6是4.70381724732,当被int截断时,它变成4,当+1完成时,它变成5

类似地,Math.random可能返回0.2481654,当乘以6时为1.4889924,int截断为1,然后由于+1变为2

如果它是,比如说,0.0485847*6,那就是0.2915082,int截断为0,由于+1,它变成了1

Math.random将返回的最小值为0.0,该值被int截断为0。0*6为0,在+1之后变为1。Math.random将返回的最高值为0.99999999等,例如。,。它将小于1。乘以6得到5.999999etc,它被int截断为5,然后被+1变成6

这就是我们如何从代码中得到1-6的范围。

Math.random

它会生成一个介于0.0到1.0之间的随机数,总是小于1.0。所以,在你的问题中,正如你所说,你想生成介于1到6之间的随机数,这就是为什么你要将它乘以6,所以函数返回的任何随机数都会乘以6,然后再乘以+1,所以它总是保持在1到6之间

就像你说的,0.78396954122*6是6,那么你在这里的计算是错误的

0.78396954122*6是4.7,它将被整数四舍五入为4。这在java中称为强制转换,最后它将变成4+1=5

这就是为什么通过这个方法得到1-6之间的数字这是一个简单的数学:

根据定义,Math.rand会在[0,1]的间隔内生成一个浮点数,比如x x乘以6等于区间[0,6][ 将其转换为int是一种截断,几乎保留原始数字的整数部分,因此该值为0、1、2、3、4或5 然后加上一个,得到1,2,3,4,5或6。 Math.random如何生成0.0到1.0之间的双精度值


生成伪随机数是一件棘手的事情。Java规范没有定义如何实现这一点,因此我们无法告诉您它是如何工作的。但是如果您想知道如何生成伪随机数,那么可能是一个很好的条目,它是

否,0.78396954122*6不是6。@JackFlamp它被截断而不是四舍五入,因此它永远不会是四舍五入的Dup@Aominè你是对的。我的错。删除…你是在问为什么一个在0.0到1.0范围内的数字,当乘以6时,最终会在0.0到6.0范围内?从字面上说,我能想到的唯一一件事让你得出结论,0.78396954122*6=6,就是int cast会以某种方式将double四舍五入到1,因此当乘以时总是6。事实并非如此。我应该说我知道什么是演员阵容……但无论如何,谢谢你的回答。谢谢你的回答