我在Java中有一个关于Math.ceil()和Math.random()一起使用的问题,以便将数字从1提取到x。
int randomNumber;
do {
randomNumber = (int) Math.ceil(Math.random() * 1);
System.out.println("Random number generated was: " + randomNumber);
}while (randomNumber != 0);
此代码将返回0,如预期的那样 - 0 * 1为0.
FLAGS
那怎么会一直回来1?我无法得到它 - 当访问Math.random()时,它会读取:"将大于或等于的伪随机{@code double}返回到{@code 0.0}并且小于{@code 1.0}"
那应该仍然允许0 * 1的情况。有人可以向我解释一下吗?
答案 0 :(得分:2)
虽然可能 Math.random()
可能确切地返回零,但它并非特别可能。因此,循环似乎无限期地运行,尽管在某些时候它最终会终止。
要了解Math.random()
可以返回多少双打(即0到1之间有多少双打),请查看this SO answer,估算数字:
不包括非正规化& c,我相信计数将是1023倍2 ** 52。
因此,恰好为零的几率约为2^52
中的一个。不要屏住呼吸等待这种情况发生。
答案 1 :(得分:0)
这就是javadoc所说的:
返回带有正号的double值,大于或等于 0.0且小于1.0。返回值是伪随机选择的,具有来自该范围的(近似)均匀分布。当这个 首先调用方法,它创建一个新的伪随机数 生成器,就像表达式
一样
所以,是的,它会在某个时间点返回0并终止loop
。但是,由于它是随机的,当它返回0时很难确定完全,因此,loop
可能会在经过几次迭代后终止,或者可能需要一段时间。