所以,我明白这似乎是一个愚蠢的问题。然而,在我的课程中,关注教授正确的代码。我遇到了这个。 Min + (Math.random() * ((Max - Min) + 1))
本质上代码就是这样。添加最小值+一个介于0.0和1.0之间的随机数乘以最大值减去最小值加1.本书将此代码视为在某些参数中检索随机值的基础。即最大= 40分钟= 20。这将得到40到20之间的值。
问题是,我知道代码在说什么和做什么。我正在使用它来生成一个随机字符,方法是在前面添加(char)并使用'a'和'z'作为值。但事情是,我不明白,从数学上讲,这甚至是有效的。据我所知,这让我成为一名非常糟糕的程序员。我从未声称自己伟大或辉煌。我知道代数和一些基本的高等数学概念,但有一些像这样的基本愚蠢的公式让我摸不着头脑。
就编程逻辑而言,这对我来说不是一个问题,而是看到这样的概念。我糊涂了。我没有得到这段代码的数学逻辑。我错过了什么吗?我的意思是,在数学随机值介于0.0和1.0之间的情况下,我不知道它如何在最小值和最大值之间获得值。有人愿意给我一个外行人解释这是如何工作的吗?
答案 0 :(得分:1)
想象一下,橡胶纤维跨越点0和1(线段)
在其上撒上一些染料滴 - 您在0..1间隔内生成了随机值
现在修复左侧点并拉伸此光纤,直到其长度变为Max - Min
现在将其向右移动Min
您可以在区间Min..Max
通常,这是将一个区间(0..1
)线性转换为另一个区间(Min..Max
)。请注意,初始间隔可能是任意的。
答案 1 :(得分:1)
它被称为线性插值,有时甚至线性外推取决于您是在放大还是缩小动态范围。无论如何,动态范围变化背后的想法是:
让我们:
x = < x0 , x1 > // input range
我们希望将它们改为
y = < y0 , y1 > // output range
所以让我一步一步地推导出来:
// equation range operation
y = x // < x0 , x1 > -x0
y = x-x0 // < 0 , x1-x0 > /(x1-x0)
y = (x-x0)/(x1-x0) // < 0 , 1 > *(y1-y0)
y = (y1-y0)(x-x0)/(x1-x0) // < 0 , y1-y0 > +y0
y = y0 + (y1-y0)(x-x0)/(x1-x0) // < y0 , y1 >
现在我怀疑x=Math().random()
会返回值x=<0,1>
,我们希望结果为<y0,y1> = <min,max>
:
y = min + (max-min)(x-0)/(1-0)
y = min + (max-min)*x
+1
导致<min,max+1>
范围,或者如果您的Random()<1
恢复范围从<min,max)
回到<min,max>
很难说没有上下文(我不知道)假设 JAVA 或类似的东西我的语言代码我更像是一个 C ++ 的人)
为简单起见,线性插值/外推法是使用某个参数t=<0,1>
线性获得两个边/点/值之间的值
x(t) = x0 + (x1-x0)*t
如果(t=0)
则x(0)=x0
如果(t=1)
然后x(1)=x1
如果(t=0.5)
然后x(0.5)=
介于x0
和x1
之间
如果t=<0,1>
那么我们谈的是线性插值。如果t
超出此范围,那么我们正在谈论线性外推(方程是相同的)。
线性意味着当您使用常量t
步采样点/值时,结果值之间的距离也将保持恒定。并且也在一条线上......
希望现在很清楚。