【问题标题】:Generating a number between 1 and 2 java Math.random() [duplicate]生成 1 到 2 之间的数字 java Math.random() [重复]
【发布时间】:2014-01-21 00:08:32
【问题描述】:

我正在使用导入的 math.random() 类创建介于 1 和 2 之间的数字范围。

这是我到目前为止的工作方式,但我看不出它是如何工作的:

int tmp = (int)(Math.random()*1)+1;

任何人都知道这是否真的可以获取范围吗?如果不是..那是什么

编辑:寻找数字 1 或 2。

【问题讨论】:

  • 1 和 2 之间没有整数。那么您实际上要生成什么?

标签: java math random


【解决方案1】:

如果您希望值 1 或 2 的概率相等,那么您只需要 int temp = (Math.random() <= 0.5) ? 1 : 2;。这给你一个 1 或 2,每个概率为 1/2。

【讨论】:

  • 不是真的,你应该使用
  • @peter.petrov 在数学上它是 CDF 的离散反演,而 CDF 是 <= 不等式。从计算上讲,您可能会争辩说 RNG 产生 0 但不是 1,因此 2**31-1 中的一个部分的曲调存在不对称性,这实际上没有区别。由于我是一名统计学家,因此我倾向于直接翻译数学定义。
  • @peter.petrov 这也很容易将混合物分成不同的比例。只需将测试中的比例值更改为新目标即可。
  • @peter.petrov 我认为您可能会争辩说,从数学上讲,您有两个等效范围,而从技术上讲,我没有。你的需要更多的计算(加法、地板和铸造与单一比较)。我认为任何统计测试都无法根据人们实际可能抽取的任何样本量来判断结果的差异。
  • 好的,我想我明白了。谢谢。
【解决方案2】:
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。

【讨论】:

    【解决方案3】:

    试试这个。

    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

    【讨论】:

    • +1,但您不需要Math.floor
    【解决方案4】:

    好的,你想使用Math.random,但你可以使用java.util.Random,所以不需要强制转换或舍入:

        java.util.Random random = new java.util.Random();
        int tmp = random.nextInt(2) + 1;
    

    【讨论】:

    • +1 我正在查看这些答案,想知道为什么没有人使用Random。特别是因为您可以将其替换为 SecureRandom
    • 我在课堂上使用这个代码,我们应该在课程中说,math.random() 是唯一随机教授的。
    • 它是java.util的一部分,那个类是用来解决这类问题的。
    猜你喜欢
    • 1970-01-01
    • 2013-12-21
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多