不理解在两个值之间获取随机数的代码

时间:2017-01-31 09:58:38

标签: math random logic

所以,我明白这似乎是一个愚蠢的问题。然而,在我的课程中,关注教授正确的代码。我遇到了这个。 Min + (Math.random() * ((Max - Min) + 1))本质上代码就是这样。添加最小值+一个介于0.0和1.0之间的随机数乘以最大值减去最小值加1.本书将此代码视为在某些参数中检索随机值的基础。即最大= 40分钟= 20。这将得到40到20之间的值。

问题是,我知道代码在说什么和做什么。我正在使用它来生成一个随机字符,方法是在前面添加(char)并使用'a'和'z'作为值。但事情是,我不明白,从数学上讲,这甚至是有效的。据我所知,这让我成为一名非常糟糕的程序员。我从未声称自己伟大或辉煌。我知道代数和一些基本的高等数学概念,但有一些像这样的基本愚蠢的公式让我摸不着头脑。

就编程逻辑而言,这对我来说不是一个问题,而是看到这样的概念。我糊涂了。我没有得到这段代码的数学逻辑。我错过了什么吗?我的意思是,在数学随机值介于0.0和1.0之间的情况下,我不知道它如何在最小值和最大值之间获得值。有人愿意给我一个外行人解释这是如何工作的吗?

2 个答案:

答案 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)=介于x0x1之间

如果t=<0,1>那么我们谈的是线性插值。如果t超出此范围,那么我们正在谈论线性外推(方程是相同的)。

线性意味着当您使用常量t步采样点/值时,结果值之间的距离也将保持恒定。并且也在一条线上......

希望现在很清楚。