影响Math.random()

时间:2010-11-03 19:06:55

标签: javascript algorithm math random

我正在寻找影响Math.random()的方法。

我有这个功能来生成从最小到最大的数字:

var rand = function(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

有没有办法让它更有可能得到一个低数字和高数字而不是中间的数字?

例如; rand(0,10)将返回0,1,9,10,而不是其余的。

8 个答案:

答案 0 :(得分:13)

  

有没有办法让它更有可能得到一个低数字和高数字而不是中间的数字?

是。您想要更改生成的数字的分布。

http://en.wikipedia.org/wiki/Random_number_generation#Generation_from_a_probability_distribution

答案 1 :(得分:2)

一个简单的解决方案是使用100个元素生成一个数组。

在这100个元素中,更频繁地代表您感兴趣的数字。

作为一个简单的例子,假设您想要更频繁地显示数字1和10,您可以在数组中过度表示它。即。数组中的第一个20次,数组中的数字10次20次,其余数字均匀分布。然后使用0-100之间的随机数作为数组索引。这将增加你获得1或10的概率与其他数字相比。

答案 2 :(得分:2)

您需要一张分发图。从随机输出[0,1]映射到您期望的分布结果。如[0,.3]将产生0,[。3,.5]将产生1,依此类推。

答案 3 :(得分:1)

不确定。目前还不完全清楚你是否想要平滑滚降(例如)2和8的返回频率高于5或6,但总体思路无论如何都有效。

执行此操作的典型方法是生成比您输出的更大范围的数字。例如,让我们从5开始,作为以频率N出现的基线。假设您希望4或7频率为2N,3或8,频率为3N,2或9,频率为4N,0或10频率为5N

添加它们,我们需要来自生成器的1到29(或0到28,或其他)的值。前5个中的任何一个给出0的输出。接下来的4个给出和输出中的任何一个。接下来的3中的任何一个给出2的输出,依此类推。

当然,这不会改变原始生成器返回的值 - 它只是让我们编写一个我们自己的生成器,它根据我们选择的分布生成数字。

答案 4 :(得分:0)

不是真的。存在基于种子生成的一系列数字。你的随机数来自序列。当你随机调用时,你正在抓住序列的下一个元素。

答案 5 :(得分:0)

你能否影响javascript(运行客户端)的Math.random输出?

没有。至少不是以任何可行/实际的方式。

但你可以做的是创建一个自己的随机数生成器,在你需要的发行版中产生数字。

答案 6 :(得分:0)

可能有无数种方法,你可能想要考虑概率函数的确切形状/曲率。

可能可以在一行中完成,但这是一个使用现有函数定义(在此处命名为rand)的多行方法:

var dd = rand(1,5) + rand(0,5);
var result;
if (dd > 5)
    result = dd - 5;
else result = 6 - dd;

答案 7 :(得分:0)

一个基本结果是,如果U是具有均匀分布的随机变量,而F是要从中采样的累积分布,则Y = G(X)其中G是F的倒数,其中F为其累积分布。这可能不一定是最有效的方法,并且从所有类型的分布中生成随机数本身就是一个研究子域。但是对于一个简单的转换,它可能就是这样做的。与你的情况类似,F(x)可以是4 *(x-.5)^ 3 + .5,它似乎满足所有约束并且易于反转并用作基本随机数生成器的转换。