请问上述代码中第 135 行是什么含义?
我理解这行代码的目的应该是想得到一个可以被 n 整除的最大值,使得最终生成的随机数是等概率的。
那么我是否可以将这行代码由:
max := int32((1 << 31) - 1 - (1<<31)%uint32(n))
替换为:
max := int32((1 << 31) - 1 - ((1 << 31) - 1)%uint32(n) - 1)
请万能的 V 友指点。
1
AoEiuV020 2021-06-16 10:32:28 +08:00
不明觉历,这前后不等价吧,把 n=(1<<31)代入算一下?
|
2
AoEiuV020 2021-06-16 10:44:45 +08:00
|
3
mainjzb 2021-06-16 11:22:00 +08:00
你的理解是对的,你的替换代码是错的
代入 n=100, 得 max=2147483599 |
4
mainjzb 2021-06-16 11:22:36 +08:00
你的理解是对的,你的替换代码是错的
代入 n=100, 得 max=2147483599 max 的值是[0,2147483599] 正好是 2147483600 个数字 |
5
mainjzb 2021-06-16 11:28:21 +08:00
前面-1 是因为他要算入 0 这个数字,后面正常思考就行
int32((1 << 31) - 1) = [0, 2147483647] max = [0, 2147483647 - (2147483648%n)] |
6
lujjjh 2021-06-16 11:59:42 +08:00
> 我理解这行代码的目的应该是想得到一个可以被 n 整除的最大值
其实是得到一个最大的 max 使得 n | (max + 1),因为这里 max 是可以取到的。 也可以改成 max := (1<<31) - (1<<31)%uint32(n) ... for uint32(v) >= max { |