所以,我有个问题。基本上,我在高中数学上没有足够的注意力,现在我被卡住了。我需要生成1和20之间的随机数,重点放在1到5之间的一个,轻强调5-10,低强调10-20。我不理解所有花哨的概率词和他们在我遇到的文章中说的所有东西。如果你们能提供任何帮助,我们将不胜感激。谢谢!
发布于 2012-02-20 13:38:18
您可以使用此公式生成一个范围为低、高的随机数
var randomNumber:int = Math.floor(Math.random()*(1+high-low))+low;
如果你愿意,你可以把它放在一个函数中。
现在,对于您提供的三个间隔,一种简单的方法是获得不同的概率,方法如下:
var random:Number = Math.random();
if (random < 0.75) {
// generate random number in [1, 5]
} else if (random < 0.95) {
// generate random number in [6, 10]
} else {
// generate random number in [11, 20]
}
发布于 2012-02-20 21:15:09
如果你需要一个“平滑”的发行版,你也可以使用下面的方法。也就是说,分布将在最低和最高值之间逐渐变化,在下面的情况下,重点将放在较低的值上。
private function univenlyDistributedRandom(low:int, high:int):Number
{
return low + (1 - Math.pow(Math.random(), 4)) * (high - low);
}
当然,您可以使用任何其他函数(夸张或正弦等)来生成略有不同的变体。不过有一件事很有趣。如果你正在使用任何类型的补间引擎-你可能已经有了这些类型的函数!任何应用于Math.random()
输出的非线性缓和函数都会以一种“平滑”的方式影响分布。因此,例如,如果您看到easing函数执行类似于“一开始变慢,但随后变得更快,更快,甚至更快”的操作,这将意味着使用它可以实现的分布将偏向较小的数字,而较大的数字将较少出现。
发布于 2012-02-21 18:47:35
我会用一个彭纳方程。http://www.robertpenner.com/easing/
生成一个介于0和1之间的数字。将其赋给penner方程,它将返回一个介于0和1之间的数字。将此数字乘以所需的最大值。绕过它。
number = Math.round(MyTransformFunction(Math.random())*MaxNumber)
function MyTransformFunction(x){
return x*x;
}
对于0-1之间的输入,返回0-1之间的数字的任何其他函数都将起作用:
return -x*x;
return Math.sqrt(x);
https://stackoverflow.com/questions/9356318
复制相似问题