我正在开发一个程序,该程序根据用户输入的种子,开始和结束范围为用户生成伪随机数。我已经基于 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)
- 因此,每次调用将使用更多的随机数
- 不要担心种子的东西仍然会起作用...