【问题标题】:Don't understand code that gets random number between two values不理解在两个值之间获取随机数的代码
【发布时间】:2017-01-31 09:58:37
【问题描述】:

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

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

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

【问题讨论】:

  • 谢谢,您的解释有助于解释功能。很高兴知道它真的有名字。

标签: math random logic


【解决方案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=&lt;0,1&gt;,然后我们想要&lt;y0,y1&gt; = &lt;min,max&gt; 的结果:

y = min + (max-min)(x-0)/(1-0)
y = min + (max-min)*x

+1 导致 &lt;min,max+1&gt; 范围,或者如果您的 Random()&lt;1 将范围从 &lt;min,max) 恢复到 &lt;min,max&gt; 很难说没有上下文(假设 JAVA 或类似的东西我更像是一个 C++ 家伙)

为简单起见,线性插值/外插是用一些参数t=&lt;0,1&gt;线性获取两条边/点/值之间的值

x(t) = x0 + (x1-x0)*t


如果(t=0) 那么x(0)=x0
如果(t=1) 那么x(1)=x1
如果(t=0.5)x(0.5)= 介于x0x1 之间

如果t=&lt;0,1&gt;,那么我们谈论的是线性插值。如果t 超出此范围,那么我们正在讨论线性外推(等式相同)。

线性意味着当您使用常量t 步长对点/值进行采样时,结果值之间的距离也将保持不变。而且也位于一条线上...

希望现在清楚了。

【讨论】:

    【解决方案2】:

    想象一下跨越点 0 和 1(线段)之间的橡胶纤维。
    在其上洒一些染料滴 - 您已在 0..1 间隔内生成随机值。
    现在修复左点并拉伸该纤维,直到其长度变为Max - Min
    现在将其右移Min
    您可以在间隔Min..Max 上看到一些色点(随机值)

    一般来说,这是一个区间 (0..1) 到另一个区间 (Min..Max) 的线性变换。请注意,初始间隔可能是任意的。

    【讨论】:

      猜你喜欢
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 2015-11-07
      • 2014-06-09
      • 1970-01-01
      • 2017-06-03
      • 2023-03-19
      相关资源
      最近更新 更多