【问题标题】:Is there any difference between random in C and random in Java?C中的随机数和Java中的随机数有什么区别吗?
【发布时间】:2014-12-12 14:22:27
【问题描述】:

由于我正在重写从 C 到 Java 经常使用随机数的应用程序,我想问一下两者之间是否有任何关键区别

rand() % 256; // C code

还有这个

import java.util.Random;
...
Random rand = new Random();
rand.nextInt(256);

有谁知道它是否以相同的方式工作,或者正如我已经写过的那样,有一些关键的区别?

【问题讨论】:

  • 你是什么意思,关键的区别?显然,一个关键的区别是一个人的 C 和另一个人的 Java...
  • 显然他问的是行为上是否存在关键差异,例如可能结果的范围。来吧,伙计们,这不是一个愚蠢的问题。
  • 除了用不同的语言编写之外,它们可能(我认为甚至可能)使用不同的PRNG functions
  • 您可以查看此链接,以便您在 java 中理解:stackoverflow.com/questions/363681/… 最好的。
  • 正如 atamanroman 所说,我在问它们的行为如何,因为我希望我的应用程序具有相同的行为。或者至少大部分相同。 Elliot Frisch:所以我应该检查他们两个的 PRNG 函数?

标签: java c random


【解决方案1】:

除了使用不同的伪随机算法可能导致的概率分布不同之外,两者之间没有区别:两个 sn-ps 都生成一个介于 0 和 255 之间的数字,包括两端。

【讨论】:

  • 是的,rand() 在每个应用程序中播种一次可能很重要,而您每次创建 new Random() 时都会获得一个新种子。使用 Random 作为单例可能会导致性能问题 - 我不能代表 c 版本。
  • Random 是本地还是字段,除了性能无关紧要。也就是说,除非您查看非常长的数字序列,否则它不会或多或少是随机的。
  • 内置的 Random 在 2^^48 个值后重复。如果这是一个问题,请使用 SecureRandom,它更昂贵但在该规模上更随机。
  • 虽然第二个例子效率更高,但它最终会重复。
  • @PeterLawrey 你是对的,我不应该对此进行不必要的详细说明 - 这与 OP 的要求无关紧要。谢谢!
【解决方案2】:

就功能而言,两者都承诺在 [0..255] 范围内(伪)随机分布 int。实现细节(例如,使用的 PRNG 算法)可能会有所不同,但你真的不应该依赖这些。

【讨论】:

    【解决方案3】:

    我将主要采用@Mureinik 的回答,并补充一点,您应该知道,由于模运算,C 版本不提供均匀分布的数字(IIRC RAND_MAX 必须除以您的 n对于这种情况)。

    如果这对您很重要,那么您可能一开始就不应该使用rand()...

    干杯,

    【讨论】:

      【解决方案4】:

      您不应该使用 mod % 运算符来缩小随机范围,因为数字的概率不会相同· 例如,如果 RAND_MAX 是 256,则数字 1 的概率会高于其余的部分。

      您可以在 Python 中对此进行测试,零的数量大约是一的两倍:

      >>> sorted([(random.randint(0, 2) % 2) for x in range(100)])
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
      

      要获得与 C 中的 Java 锥相同的概率分布,您应该执行以下操作:

      /* Returns a random number from 0 to limit inclusive */
      int rand_int(int limit) {
        return ((long long)limit * rand()) / RAND_MAX
      }
      

      【讨论】:

      • 谢谢!我会试试。甚至没有怀疑有更高概率的数字。
      • 这不适用于二的幂。每个位都有相同的机会为 0 或 1,当您 % powerOf2 时,您屏蔽了高位,而低位保持不变,就像它们一样随机。
      • @PeterLawrey 只要 RAND_MAX 也是(二的幂 - 1),是的。但是 c std 对此只字未提。 stackoverflow.com/questions/4945698/…
      • RAND_MAX 是包含还是排他?如果它是包容性的,那么您似乎获得 RAND_MAX 的机会非常小,因此 limit 包容性。
      • @PeterLawrey 是的,这就是评论所说的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      相关资源
      最近更新 更多