Java中的随机数和Java中的随机数之间有什么区别吗?

时间:2014-12-12 14:22:28

标签: java c random

因为我正在重写从C到Java使用random的应用程序,我想问一下是否有任何关键的区别

rand() % 256; // C code

和这个

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

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

4 个答案:

答案 0 :(得分:5)

除了使用不同伪随机算法引起的概率分布可能存在差异外,两者之间没有差异:两个片段都会生成0到255之间的数字,包括两端。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我主要使用@ Mureinik的答案,并且只是补充一点,你应该知道C版本不能提供均匀分布的数字,因为模数运算(IIRC RAND_MAX已经为了这个原因,你可以n均匀划分。

如果这对您很重要,那么您可能不应该首先使用rand(),但是......

干杯,

答案 3 :(得分:0)

您不应该使用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
}