random - 生成用于测试的强偏差随机数

标签 random lua automated-tests distribution

我想使用随机输入运行测试,并且需要生成“合理”随机 数字,即匹配得足以通过测试函数的数字 先决条件,但希望在其代码内部造成严重破坏。

math.random() (我使用的是 Lua)产生均匀分布的随机数 数字。按比例放大这些将得到比小数字更多的大数字, 并且整数会很少。

我想扭曲随机数(或者使用旧的随机数生成新的随机数) 作为随机源)以强烈支持“简单”数字的方式, 但仍会覆盖整个范围,即扩展到正/负无穷大 (或 ±1e309 表示 double)。这意味着:

  • 十以内的数字应该是最常见的,
  • 整数应该比分数更常见,
  • 以 0.5 结尾的数字应该是最常见的分数,
  • 其次是0.25和0.75;那么 0.125,
  • 等等。

不同的描述:修复基本概率x,使得概率 总和为 1,并将数字 n 的概率定义为 xk 其中kn被构建为超现实的一代 数字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 永远无法准确表示。

最佳答案

这对于算法来说怎么样?

  1. 使用库函数生成 (0, 1) 范围内的随机 float
  2. 根据所需的概率密度函数生成随机积分舍入点(例如,0 的概率为 0.5、1 的概率为 0.25、2 的概率为 0.125,...)。
  3. 按该舍入点对浮点进行“舍入”(例如 floor((float_val << roundoff)+0.5) )
  4. 根据另一个 PDF 生成随机积分指数(例如 0、1、2、3,每个概率为 0.1,此后递减)
  5. 将舍入 float 乘以 2指数

关于random - 生成用于测试的强偏差随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12765564/

相关文章:

algorithm - 结合 PRNG 和 'true' 随机,快速和(也许)愚蠢的方式

c++ - 如何在 C++ 中从具有不同概率的数组中随机选择元素

module - 扩展标准库模块

c - 使用 tolua++ 绑定(bind)结构和 ctor/dtor

lua - 通过 Lua 脚本重启系统

android - ActivityTestRule 在 android 测试中被弃用

mysql - MySql 示例数据中的随机日期

Javascript背景根据函数变化

testing - Visual Studio 2015 测试代理的 ISO 在哪里?

java - Selenium 动态生长表