在C语言中的随机数和Java语言中的随机数有区别吗?

3

我正在将一个使用随机数的应用程序从C语言重写成Java语言,想问一下在这两种语言中是否有任何关键差异?

rand() % 256; // C code

并且这个

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

有人知道它是否以同样的方式工作,还是像我已经写过的那样,存在一些关键的区别吗?


3
你所说的“ critical difference ”是什么意思?显然,其中一个关键区别在于一个使用 C 语言,另一个使用 Java... - Marc B
显然他在问是否存在关键的行为差异,例如可能结果的范围。来吧,伙计们,这不是一个愚蠢的问题。 - atamanroman
除了使用不同的编程语言编写之外,它们可能(我认为甚至很有可能)使用不同的伪随机数生成器函数。 - Elliott Frisch
你可以查看这个链接,这样你就能理解在Java中生成随机整数的最佳方法:https://dev59.com/hXRC5IYBdhLWcg3wP-j4 - Rickey
正如atamanroman所说,我想知道它们两者的行为方式,因为我希望我的应用程序具有相同的行为方式。或者至少大部分相同。Elliot Frisch: 那么我应该检查它们两个PRNG函数吗? - Martin Plávek
4个回答

5
除了采用不同的伪随机算法可能导致概率分布上的差异外,这两种方法没有区别:两个代码片段都生成一个介于0到255之间(包括两端)的数字。

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - atamanroman
无论Random是本地变量还是字段,除了性能之外并不重要。也就是说,除非您查看非常长的数字序列,否则它的随机性不会更多或更少。 - Peter Lawrey
内置的随机数在生成2^^48个值后会重复。如果这是一个问题,可以使用SecureRandom,它在这个范围内更加随机,但也更加昂贵。 - Peter Lawrey
虽然第二个例子更有效率,但最终会重复。 - Peter Lawrey
1
@PeterLawrey 您说得对,我不应该在这个问题上过多地涉及不必要的细节。这些都与 OP 所问的问题无关。谢谢! - Sergey Kalinichenko

1
就功能而言,两者都承诺在[0..255]范围内以(伪)随机分布的方式生成一个int。具体实现细节(例如使用的PRNG算法)可能不同,但您真的不应该依赖这些细节。

1
我将主要采用 @Mureinik 的答案,并补充说明,由于模数运算(如果我没记错,RAND_MAX 必须能够被您的 n 整除),C 版本不提供均匀分布的数字。

如果这对您很重要,您可能在第一次使用时就不应该使用 rand() ...

干杯!


0

在编程中,不应使用模 % 运算符来缩小随机范围,因为数字的概率将不会相同。例如,如果 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]

要获得与Java锥形相同的概率分布,您应该执行类似以下的操作:
/* Returns a random number from 0 to limit inclusive */
int rand_int(int limit) {
  return ((long long)limit * rand()) / RAND_MAX
}

谢谢!我会试一下。甚至没有想到还有更高概率的数字。 - Martin Plávek
1
这不适用于2的幂次方。每个位都有相等的可能性成为0或1,当你%powerOf2时,你会屏蔽掉高位,并且低位保持不变,仍然像之前一样随机。 - Peter Lawrey
1
只要“RAND_MAX”也是2的幂次方减1,那就是没问题的。但是C标准没有明确规定。https://dev59.com/Om445IYBdhLWcg3wR4RN - vz0
RAND_MAX是包含还是不包含的?如果它是包含的,那么你似乎有很小的机会获得RAND_MAX,因此limit也是包含的。 - Peter Lawrey
@PeterLawrey 是的,这就是评论所说的。 - vz0
也许你可以重新编写它,使“limit”与其他数字具有相同的机会。 - Peter Lawrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接