【问题标题】:Java Math.random periodJava Math.random 周期
【发布时间】:2017-02-16 19:28:44
【问题描述】:

我正在做一个关于随机数的大型学校项目,但我找不到Math.random() 的句点。我安装了 7.0.800.15 版本,并且正在使用 Windows 10 计算机。我尝试使用一个简单的程序确定周期,该程序保存以下第一个值:

double num = Math.random(); 

在一个数组中,然后循环,直到它再次在一行中找到相同的值,因此一个周期会过去,但是没有结果,周期太长了。

所以我的问题是:我的版本中Math.random() 的周期是多少? 或者:有没有办法用一个简单的程序来确定周期?

编辑:删除了指向一个关于 JavaScript 的页面的源,它不相关

【问题讨论】:

  • 经期是什么意思?返回相同结果之前的调用次数?
  • 您的问题是关于 Java 还是 Javascript?该链接正在谈论 Javascript。
  • @Izruo 我的意思是,在相同数字开始重复之前的呼叫次数
  • 我现在意识到这篇文章是关于 javaScript 的,我的错,这是我能找到的唯一来源,谢谢。我的问题是关于 Java @Kayman
  • 请注意,在真正的随机数生成器中,您可能无法仅通过打印值来判断周期是多少。例如,这些值有可能(但可能性不大)是 3、2234、96、3、2234、96、3、2234、96,... 您可能会错误地得出周期为 3 的结论。跨度>

标签: java random


【解决方案1】:

Java 的 Math.Random 使用模数为 2^48 的线性同余生成器。这种具有良好参数选择的伪随机发生器的周期等于模数。显然,Java 中的参数是经过合理选择的,因此实际上周期是 2^48。

来源: https://en.wikipedia.org/wiki/Linear_congruential_generator http://www.javamex.com/tutorials/random_numbers/java_util_random_algorithm.shtml#.WKX-gRJ97dQ

【讨论】:

    【解决方案2】:

    linear congruential generator 上的 wiki 引用 Java (java.util.Random) 的模数为 248。 可能是这个时期,但您可能需要阅读更多关于这些类型的随机生成器的信息。

    这个问题(How good is java.util.Random?)也引用了同一时期。

    【讨论】:

      【解决方案3】:

      只是添加到其他答案并更一般地评论随机数生成器并编写程序以确定周期是什么,请注意Birthday ParadoxGambler's Fallacy。如果您生成某个值x,则下一个数字仍然与任何其他数字一样可能是x,并且在您可能重复之前需要生成的数字数量实际上非常小(这意味着您原则上可以在周期结束之前开始看到一些重复项,这会使编写程序来测试这一点变得复杂)。

      can be approximatedsqrt(2m * p(n)) 的概率高达 50% 左右的重复概率,其中p(n) 是您尝试计算的概率,m 是选择的数量。对于 32 位整数,sqrt(2m * p(n)) = sqrt(2 * 2^32 * 0.5) = sqrt(2^32) = 65,536。就是这样 - 一旦你生成了 65,536 个数字,你就有大约 50-50 的机会生成了重复。

      一旦您生成了 2^32 + 1 值,Pigeonhole Principle 指定您必须生成至少一个副本(当然,假设您'重新生成一个 32 位数字)。

      您可能还对this question 感兴趣,了解您是否可以指望随机数是唯一的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多