我不明白这个(对不起):
我正在尝试在 1 的任一侧设置一个随机数:.98、1.02、.94、1.1 等。
所以,我将为这个问题提供一个通用的解决方案。
转换随机数生成器
如果您有一个在给定范围 [0, 1)* 内具有均匀分布的随机数生成器,您可以使用以下方法将其转换为任何分布:
1 - 将分布描述为定义在输出范围内且总面积为 1 的函数。所以这个函数是 f(x) = 获得值 x 的概率。
2 - 集成**函数。
3 - 将其等同于“随机”*。
4 - 求解 x 的方程。所以 ti 给你 x 在随机函数中的值。
*:任何输入分布的泛化如下。
**:积分函数的常数项为0(即丢弃)。
**:表示生成一个在[0, 1)范围内均匀分布的随机数的结果的变量。 [我不确定这是否是正确的英文名称]
示例:
假设您想要一个分布为f(x)=x^2 from 0 to 100 的值。好吧,该函数没有标准化,因为该范围内函数下方的总面积是 1000000/3 而不是 1。所以你标准化它在垂直轴上缩放曲线(保持相对比例),即除以总面积:@ 987654323@.
现在,我们有一个总面积为 1 的函数。下一步是对它进行积分(您可能已经这样做以获得面积)并将其等同于随机数。
集成函数为:F(x)=x^3/1000000+c。并将其等同于随机数:r=x^3/1000000(请记住,我们丢弃了常数项)。
现在,我们需要求解 x 的方程,得到的表达式:x=100*r^(1/3)。现在您可以使用此公式生成具有所需分布的数字。
泛化
如果你有一个自定义分布的随机数生成器,并且想要另一个不同的任意分布,你首先需要源分布函数,然后用它来表达目标任意随机数生成器。要获得分布函数,请执行最多 3 步。对于目标,请执行所有步骤,然后将 randomic 替换为您从源分布中获得的表达式。
举个例子就更好理解了……
示例:
您有一个在 [0, 100) 范围内均匀分布的随机数生成器,并且您想要.. 为简单起见,相同的分布 f(x)=3*x^2 / 1000000 from 0 to 100 [因为我们已经完成了所有步骤,为我们提供了 x=100*r^(1/3)] .
由于源分布是均匀的,因此函数是恒定的:f(z)=1。但我们需要对范围进行归一化,留下:f(z)=1/100。
现在,我们整合它:F(z)=z/100。并将其等同于随机数:r=z/100,但这次我们不为 x 求解,而是用它来替换目标中的 r:
x=100*r^(1/3) where r = z/100
=>
x=100*(z/100)^(1/3)
=>
x=z^(1/3)
现在您可以使用x=z^(1/3) 来计算分布f(x)=3*x^2 / 1000000 from 0 to 100 的随机数,从分布f(z)=1/100 from 0 to 100 中的一个随机数开始[uniform]。
注意:如果您有正态分布,请改用 bell 函数。相同的方法适用于任何其他发行版。注意某些分布可能产生的渐近线,您可能需要尝试不同的方法来求解方程。
关于离散分布
有时您需要表达离散分布,例如,您希望以 95% 的机会获得 0,以 5% 的机会获得 1。那你是怎么做到的呢?
好吧,您将其划分为矩形分布,使范围连接到 [0, 1) 并使用随机数进行评估:
0 if r is in [0, 0.95)
f(r) = {
1 if r is in [0.95, 1)
或者你可以走复杂的路径,就是这样写一个分布函数(让每个选项正好是长度为1的范围):
0.95 if x is in [0, 1)
f(x) = {
0.5 if x is in [1, 2)
由于每个范围的长度为 1,并且分配的值总和为 1,我们知道总面积为 1。现在下一步是对其进行积分:
0.95*x if x is in [0, 1)
F(x) = {
(0.5*(x-1))+0.95 = 0.5*x + 0.45 if x is in [1, 2)
将其等同于随机:
0.95*x if x is in [0, 1)
r = {
0.5*x + 0.45 if x is in [1, 2)
然后解方程...
好的,要求解这种方程,首先通过应用函数计算输出范围:
[0, 1) becomes [0, 0.95)
[1, 2) becomes [0.95, {(0.5*(x-1))+0.95 where x = 2} = 1)
现在,这些是解决方案的范围:
? if r is in [0, 0.95)
x = {
? if r is in [0.95, 1)
现在,解决内部函数:
r/0.95 if r is in [0, 0.95)
x = {
2*(r-0.45) = 2*r-0.9 if r is in [0.95, 1)
但是,由于输出是离散的,我们在做整数部分后得到相同的结果:
0 if r is in [0, 0.95)
x = {
1 if r is in [0.95, 1)
注意:使用随机表示伪随机。
编辑:找到on wikipedia(我知道不是我发明的)。