缩放 32 位随机数以使其进入特定范围?
Scaling a 32 bit random number to get it into specific range?
在 ARM 汇编中
如何缩放 32 位随机数以获得 4.0-25.0 之间的数字?
我能想到的就是提取前五位并使用它,但这并不是真正的缩放...
我正在寻找诸如乘除 32 位数之类的方法以使其进入该范围。
你想要实现的技术是这样的(在C
):
float scale (u32 v)
{
return (float) v / 0xffffffffL * (25 - 4) + 4.0;
}
由于分母是常数,如果速度很重要,可以仅使用乘法重写。
wallyk 回答了它,但这只是小学的东西,写下两个分数并求解未知数。
x/y = a/b
rand/0xFFFFFFFF = a/21
(rand/0xFFFFFFFF)*21=a;
然后你给a加4。
如果对你来说足够准确,你可以这样做
(rand/204522252.143)+4.0
如果您正确编写代码,编译器可能会为您优化它
x=((rand/((double)0xFFFFFFFF))*21.0)+4.0;
或
x=((rand/4294967295.0)*21.0)+4.0;
在 ARM 汇编中 如何缩放 32 位随机数以获得 4.0-25.0 之间的数字?
我能想到的就是提取前五位并使用它,但这并不是真正的缩放...
我正在寻找诸如乘除 32 位数之类的方法以使其进入该范围。
你想要实现的技术是这样的(在C
):
float scale (u32 v)
{
return (float) v / 0xffffffffL * (25 - 4) + 4.0;
}
由于分母是常数,如果速度很重要,可以仅使用乘法重写。
wallyk 回答了它,但这只是小学的东西,写下两个分数并求解未知数。
x/y = a/b
rand/0xFFFFFFFF = a/21
(rand/0xFFFFFFFF)*21=a;
然后你给a加4。
如果对你来说足够准确,你可以这样做
(rand/204522252.143)+4.0
如果您正确编写代码,编译器可能会为您优化它
x=((rand/((double)0xFFFFFFFF))*21.0)+4.0;
或
x=((rand/4294967295.0)*21.0)+4.0;