因为我正在重写从C到Java使用random的应用程序,我想问一下是否有任何关键的区别
rand() % 256; // C code
和这个
import java.util.Random;
...
Random rand = new Random();
rand.nextInt(256);
有人知道它是否以相同的方式运作,或者正如我已经写过的那样,有一些关键的区别?
答案 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
}