我实现了一个随机数/噪音发生器。 (Perlin噪音,具体而言)。
然而,从算法生成的随机数(取自维基百科)返回从-1到1的浮点数。我需要它从0到1返回。有没有办法我可以缩小它而不会弄乱数字分布/图案?
如果需要代码,我会在这里发布,但是如果有可能的话,我会喜欢混乱/添加生成的数字(如果数字为负则乘以-1)这样它就会成为从0到1(当然没有打破数量分布)
这有可能吗?
答案 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