算法缩小从随机数/噪声发生器创建的范围

时间:2015-03-09 14:53:24

标签: algorithm math

我实现了一个随机数/噪音发生器。 (Perlin噪音,具体而言)。
然而,从算法生成的随机数(取自维基百科)返回从-1到1的浮点数。我需要它从0到1返回。有没有办法我可以缩小它而不会弄乱数字分布/图案?

如果需要代码,我会在这里发布,但是如果有可能的话,我会喜欢混乱/添加生成的数字(如果数字为负则乘以-1)这样它就会成为从0到1(当然没有打破数量分布)
这有可能吗?

3 个答案:

答案 0 :(得分:0)

类似

if x<0
   x *=-1

x = random()*0.5+0.5

我认为会工作。

答案 1 :(得分:0)

harequin 的乘以-1的方法肯定会给你正确的范围。但是,我不确定简单地翻转符号是否会保持相同的统计分布,因此我会采用稍微复杂一些的方式来保证您的分发。

我将它写成一个函数,其中输入是从-1到1的随机数,输出是调整到0到1范围的数字。

float rerange(float original)
{
  //this reranges the -1 to 1 to instead be 0 to 2
  original = original + 1;
  //this reranges the 0 to 2 to instead be 0 to 1
  original = original / 2.0;
  //now we have modified the original number to fall in the range 0 to 1. All done.
  return original;
}

请注意,该过程只是通过添加将底部边界提高到0,然后将范围的大小分开。这种技术可用于实现任何范围,如果您在最后再添加一个以重新调整范围的下限,则甚至不必从零开始。如果你想扩展范围的大小而不是像我们那样缩小范围,你可以将它乘以而不是除以它。如果你想用任何特定的语言,请告诉我。

答案 2 :(得分:0)

您经常会遇到bijectively将一个特定源间隔映射到目标间隔的任务。在您的情况下,源间隔为[-1, 1],目标间隔为[0,1] * 。但这并不重要。模式始终相同:要将范围xSource中的值[sourceMin, sourceMax]映射到范围xTarget中的值[targetMin, targetMax],您始终可以使用公式

alpha = ((xSource - sourceMin) / (sourceMax - sourceMin));
xTarget = targetMin + alpha * (targetMax - targetMin);

(在您询问的特定情况下,这将简化为xTarget = xSource * 0.5 + 0.5,正如在另一个答案中已经指出的那样 - 但是知道如何对待这样的事情总是很好的< /子>


* 但是,您应该考虑是否在谈论开放已关闭半开放间隔。见Interval - Including or excluding endpoints