拟合两个范围内的数字

时间:2014-12-04 12:07:06

标签: vba math random range modulus

我正在开发一个程序,根据用户输入的种子,开始和结束范围为用户生成伪随机数。我基于Lehmer's random number generator algorithm编写了自己的基于模数的生成器。是的我知道基于模数的随机计算是有偏见的,但是对于它的使用这种方法是绰绰有余的。

无论如何,虽然我可以在VBA中从给定的种子生成一串随机数,但我找不到任何在线的公式或代码,显示该数字如何缩小以适应所提供的上限和下限。我希望有人在这里知道一个公式,或者知道我错过了一个涵盖这种过程的网站(我甚至不知道它会被称为缩放?)

感谢您的时间!如果它有用或任何人感兴趣,这是我的VBA代码生成基于种子的数字:

random = ((CDec(1664525) * t1) * seed + 1013904223) 't1 is the incremental count for each requested number
random = random - (Int(random / 2 ^ 23) * 2 ^ 21)

感谢您的帮助!

编辑:只是要指出,'缩放'不能使用我之前看过的rand函数,因为每次使用种子时最终的数字必须相同!

1 个答案:

答案 0 :(得分:1)

@Kevin是对的,我只需要添加:

范围变化的线性插值

  • 所以,如果您的间隔x
  • 上有号码<x0,x1>
  • 并希望在时间间隔y
  • 上将其更改为<y0,y1>
  • 然后使用这个公式:
  • y=y0+((x-x0)*(y1-y0)/(x1-x0));
  • 它是2D线的公式,也是DDA算法的基础......

如果您的x范围未知,该怎么办?

  • 然后简单地将其绑定到已知的
  • 例如x&65535会将x范围更改为&lt; 0,65535&gt;
  • 仅在原始x范围高于......
  • 时才是粗略的

如果动态x范围小于动态y范围怎么办?

  • ie |x1-x0|<|y1-y0|
  • 该等式仍然有效,但您将缺少y范围内的某些数字
  • 所以间隔会有间隙
  • 以避免您必须增加x的有效范围
  • 例如像x=(rand()&255)|((rand()&255)<<8)
  • 所以每次通话都会使用更多的随机数
  • 不要担心种子会继续工作......