我正在将一个使用随机数的应用程序从C语言重写成Java语言,想问一下在这两种语言中是否有任何关键差异?
rand() % 256; // C code
并且这个
import java.util.Random;
...
Random rand = new Random();
rand.nextInt(256);
有人知道它是否以同样的方式工作,还是像我已经写过的那样,存在一些关键的区别吗?
我正在将一个使用随机数的应用程序从C语言重写成Java语言,想问一下在这两种语言中是否有任何关键差异?
rand() % 256; // C code
并且这个
import java.util.Random;
...
Random rand = new Random();
rand.nextInt(256);
有人知道它是否以同样的方式工作,还是像我已经写过的那样,存在一些关键的区别吗?
int
。具体实现细节(例如使用的PRNG算法)可能不同,但您真的不应该依赖这些细节。RAND_MAX
必须能够被您的 n
整除),C 版本不提供均匀分布的数字。
如果这对您很重要,您可能在第一次使用时就不应该使用 rand()
...
干杯!
在编程中,不应使用模 %
运算符来缩小随机范围,因为数字的概率将不会相同。例如,如果 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]
/* Returns a random number from 0 to limit inclusive */
int rand_int(int limit) {
return ((long long)limit * rand()) / RAND_MAX
}
%powerOf2
时,你会屏蔽掉高位,并且低位保持不变,仍然像之前一样随机。 - Peter Lawreylimit
也是包含的。 - Peter Lawrey