请问下,比较简单的实现 0.5 到 2 之间的随机数的方法
要求就是 扩大一倍或者缩小一倍,两边的概率相同。
这个可以用 Math.radom(),仅以数学的方式,一行就完成吗?
我好像只能先随机出是扩大还是缩小,然后在分别写扩大 /缩小的倍率。
大大们可以给个其他的思路么?
要求就是 扩大一倍或者缩小一倍,两边的概率相同。
这个可以用 Math.radom(),仅以数学的方式,一行就完成吗?
我好像只能先随机出是扩大还是缩小,然后在分别写扩大 /缩小的倍率。
大大们可以给个其他的思路么?
所以平移过去 random()+1.25 为啥不行?
1. 先投掷一枚硬币,决定是扩大或是缩小;
2. 然后决定 1~2 之间的倍率?
我的思路:
u = random(-1, 1)
if u < 0:
..x = x / (1 – u)
else:
..x = x * (1 + u)
大概我想是 e 的 x 次方 在 0.5-2 之间 ,x 是平均分布
C++的标准库的实现,从[0,1)生成[a,b)之间的分布
因此换个思路的话,你这个其实是指数对称,也就是 2^-1 表示缩小一倍,2^1 表示放大一倍,这样指数项就变成了对称且均与分布的了:
# 假设返回[-1, 1]
return exp(2, rand())
这个不理清楚后面没法做
已有一个 0-1 之间均匀分布的随机数 x,在上面加一个变换 f,变成 0.5-2 之间分布的随机数 y,要求 0.5-1 的概率和 1-2 的概率相等。问这个变换是什么。
先假定 f 在 0.5-2 之间是单调连续函数(不单调的 f 当然也可以有,先不考虑了)
那么,f(0.5) = 1 且 0.5 <= f(x) <= 2 的 f 都符合要求,比如 f(x) = x + 0.5
如果再增加一个条件,y 在 0.5 – 2 的整个区间内的概率密度都不为 0
那么只要 f(0) = 0.5, f(0.5) = 1, f(1) = 2,f 就满足要求,你随便假设比如 f(x) = ax^2 + bx + c 然后解 a b c 就好了。
如果假设 f(x) = 2^(ax+b) ,就得到 lsylsy2 给出的指数函数。
类似的还有很多符合条件的函数。
如果再增加一个条件,0.5-1 和 1-2 之间的概率密度分别都是常数,那么两边都是直线。
给定 f(0) = 0.5, f(0.5) = 1, f(1) = 2,结果是唯一的,就是那个分段函数。
计算步骤:
0. p = Math.random()
1. p <= 2/3 则 (重置随机数种子后) Math.random()*0.5 + 0.5
2. p > 2/3 则 (重置随机数种子后) Math.random()+1
区分这两种不同的方式来取随机数,就比较清晰了。
不存在这样的随机数,或者说这样设定范围必然会影响随机性。
从无限个数字中取随机数,只能是在 0-1 之间取,或者 1-2 这样可以无损转换成 0-1 的范围中取。比如 1-3 就不行,2-4 就可以。
更一般的情况更为复杂(比如你需要指定某一侧具有复杂的概率密度函数形式)那就需要先计算出 pdf/cdf 做专门的生成器了( Inverse Transform Method )
run = 1000000
first = 0
second = 0
for i in range(run):
rnd = (2 * random.random()) % 1.5 + 0.5
if rnd >= 0.5 and rnd < 1.:
first += 1
if rnd >= 1. and rnd < 2.:
second += 1
print(first / run, second / run, first + second == run)
“`
试着跑了一下,0.5 到 1 和 1 到 2 之间的概率差不多都是 0.5
关键在于你想要的是一个什么样的概率分布。
首先你需要说清楚你在讨论实数还是在讨论 64 位浮点数
如果是实数,那么 “K 是-1 到 1 的所有数的总量” 这句话不成立,后面就不用讨论了。
不能设 K 是无限,然后把 K 当一个有限的数来做后续的讨论。
如果是 64 位浮点数,那么 “每一个 Y 出现的概率都是 1/K” 是错的。
比如
2 ^ 0.1000000000000002 和 2 ^ 0.10000000000000014 的结果都是 1.0717734625362934
给定的要求只有一个,>1 和 <1 的概率相等。
这样不能确定唯一的答案,所以下面给出了很多不同的解答。
给的解释又超出了主能解理的数学,所以估计现在更不懂了。
除了上面那个给定的要求,显然还存在一个要求是概率在某种程度上是均匀的,但均匀又存在不同的均匀。
比如把所有结果 round 到一个最接近的数,然后
0.5 0.6 0.7 0.8 0.9 1.0 1.2 1.4 1.6 1.8 2.0 的概率相同
1/2.0 1/1.8 1/1.6 1/1.4 1/1.2 1/1.0 1.2/1 1.4/1 1.6/1 1.8/1 2.0/1 的概率相同
这两个也不一样,都可以被认为是均匀的
上面说的,其实不仅 “每一个 Y 出现的概率都是 1/K” 对浮点数是错的,“所有确定的 X 都是 1/K 的概率” 也是错的。
因为浮点数本身是不均匀的,但那个随机数是均匀的。
建议主放弃这个问题吧,需要补的课挺多的。