【发布时间】:2012-09-27 17:59:44
【问题描述】:
我想使用随机输入运行测试,并且需要生成“合理”随机 数字,即匹配得足够好以通过测试函数的数字 先决条件,但希望在其代码内部造成更严重的破坏。
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 永远不会由有限数生成,因为它是无限的
分数 - 浮点数也是如此,1/3 永远不会精确表示。
【问题讨论】:
-
需要注意的一点是,浮点数在其范围内不是均匀分布的。
标签: random lua automated-tests distribution