拟合两个边界内的数字



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

无论如何,虽然我可以在 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)

感谢您的帮助!

编辑:只是要指出,"缩放"不能使用兰德函数,我以前见过这样做,因为每次使用种子时最终数字都需要相同!

@Kevin是对的,我只需要补充:

用于范围变化的线性插值

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

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

  • 然后简单地将其绑定到已知的东西上
  • 例如x&65535会将 X 范围更改为 <0,65535>
  • 只有当原始 x 范围更高时,才粗略,然后......

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

  • |x1-x0|<|y1-y0|
  • 该等式仍然有效,但您将缺少 y 范围内的某些数字
  • 所以间隔会有间隙
  • 为了避免这种情况,您必须增加X的有效范围
  • 例如,像这样x=(rand()&255)|((rand()&255)<<8)
  • 因此,每次调用将使用更多的随机数
  • 不要担心种子的东西仍然会起作用...

最新更新