【发布时间】:2014-01-21 00:08:32
【问题描述】:
我正在使用导入的 math.random() 类创建介于 1 和 2 之间的数字范围。
这是我到目前为止的工作方式,但我看不出它是如何工作的:
int tmp = (int)(Math.random()*1)+1;
任何人都知道这是否真的可以获取范围吗?如果不是..那是什么
编辑:寻找数字 1 或 2。
【问题讨论】:
-
1 和 2 之间没有整数。那么您实际上要生成什么?
我正在使用导入的 math.random() 类创建介于 1 和 2 之间的数字范围。
这是我到目前为止的工作方式,但我看不出它是如何工作的:
int tmp = (int)(Math.random()*1)+1;
任何人都知道这是否真的可以获取范围吗?如果不是..那是什么
编辑:寻找数字 1 或 2。
【问题讨论】:
如果您希望值 1 或 2 的概率相等,那么您只需要 int temp = (Math.random() <= 0.5) ? 1 : 2;。这给你一个 1 或 2,每个概率为 1/2。
【讨论】:
<= 不等式。从计算上讲,您可能会争辩说 RNG 产生 0 但不是 1,因此 2**31-1 中的一个部分的曲调存在不对称性,这实际上没有区别。由于我是一名统计学家,因此我倾向于直接翻译数学定义。
int tmp = (int) ( Math.random() * 2 + 1); // will return either 1 or 2
Math.random() 从[0, 1) 返回数字。因为(int) 总是向下舍入(楼层),所以您实际上需要[1,3) 的范围,以便[1,2) 将舍入为1,[2,3) 将舍入为2。
【讨论】:
试试这个。
int tmp = (int)( Math.floor( Math.random() + 1.5 ) )
Math.random() -> [0, 1)
Math.random() + 1.5 -> [1.5, 2.5)
所以当你发言时,它要么是 1 要么是 2 等于
概率因为[1.5, 2.5) = [1.5, 2) U [2, 2.5)
和length([1.5, 2)) = length([2, 2.5)) = 0.5。
【讨论】:
Math.floor。
好的,你想使用Math.random,但你可以使用java.util.Random,所以不需要强制转换或舍入:
java.util.Random random = new java.util.Random();
int tmp = random.nextInt(2) + 1;
【讨论】:
Random。特别是因为您可以将其替换为 SecureRandom。
java.util的一部分,那个类是用来解决这类问题的。