我想使用随机输入运行测试,并且需要生成“合理”随机 数字,即匹配得足以通过测试函数的数字 先决条件,但希望在其代码内部造成严重破坏。
math.random()
(我使用的是 Lua)产生均匀分布的随机数
数字。按比例放大这些将得到比小数字更多的大数字,
并且整数会很少。
我想扭曲随机数(或者使用旧的随机数生成新的随机数)
作为随机源)以强烈支持“简单”数字的方式,
但仍会覆盖整个范围,即扩展到正/负无穷大
(或 ±1e309
表示 double
)。这意味着:
- 十以内的数字应该是最常见的,
- 整数应该比分数更常见,
- 以 0.5 结尾的数字应该是最常见的分数,
- 其次是0.25和0.75;那么 0.125,
- 等等。
不同的描述:修复基本概率x,使得概率
总和为 1,并将数字 n 的概率定义为 xk
其中k是n被构建为超现实的一代
数字1。将 x 分配给 0,将 x2 分配给 -1 和 +1,
x3 到 -2、-1/2、+1/2 和 +2,依此类推。这
对接近我想要的东西给出了很好的描述(它也有点倾斜
很多),但几乎无法用于计算随机数。所结果的
分布不是连续的(它是分形的!),我不知道如何
确定基本概率x
(我认为对于无限精度,它会是
零),并且通过迭代计算基于此的数字是非常糟糕的
缓慢(花费近乎无限的时间来构造大量数字)。
有谁知道一个简单的近似,给定均匀分布 随机源,产生非常粗略分布的随机数 如上所述?
我想运行数千个随机测试,数量/速度更多 比质量重要。尽管如此,更好的数字意味着更少的输入被拒绝。
Lua 有 JIT,所以性能通常不是什么大问题。然而,基于跳跃 随机性会破坏每个预测,并且许多对 math.random() 的调用 也会很慢。这意味着封闭公式会比封闭公式更好 迭代或递归。
1 维基百科有一个 article on surreal numbers , 和
一个nice picture 。超现实数是一对两个超现实数
数字,即x := {n|m}
,其值是中间的数字
对,即(对于有限数){n|m} = (n+m)/2
(作为有理数)。如果一侧
该对中的一个为空,这被解释为增量(或减量,如果正确的话)
为空)减一。如果两侧都是空的,则为零。最初,有
没有数字,所以唯一可以构建的数字是 0 := { | }
。一代中
两个一可以构建数字 {0| } =: 1
和 { |0} =: -1
,三者我们得到
{1| } =:2
、{|1} =:-2
、{0|1} =:1/2
和 {-1| 0} =: -1/2
(加上一些
已知数字的更复杂的表示,例如{-1|1} ? 0
)。注意
例如1/3
永远不会由有限数生成,因为它是无限的
分数 – float 也是如此,1/3
永远无法准确表示。
最佳答案
这对于算法来说怎么样?
- 使用库函数生成 (0, 1) 范围内的随机 float
- 根据所需的概率密度函数生成随机积分舍入点(例如,0 的概率为 0.5、1 的概率为 0.25、2 的概率为 0.125,...)。
- 按该舍入点对浮点进行“舍入”(例如
floor((float_val << roundoff)+0.5)
) - 根据另一个 PDF 生成随机积分指数(例如 0、1、2、3,每个概率为 0.1,此后递减)
- 将舍入 float 乘以 2指数。
关于random - 生成用于测试的强偏差随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12765564/