一、从 min 到 max 的随机数
内建函数 math.random() 会创建一个在 0 到 1 之间(不包括 1)的随机数。
编写一个 random(min, max) 函数,用以生成一个在 min 到 max 之间的随机浮点数(不包括 max))。
我们需要将区间 0…1 中的所有值“映射”为范围在 min 到 max 中的值。
这可以分两个阶段完成:
- 如果我们将
0…1
的随机数乘以 max-min,则随机数的范围将从0…1
增加到0..max-min
。 - 现在,如果我们将随机数与 min 相加,则随机数的范围将为 min 到 max。
function random(min, max) {
return min math.random() * (max - min);
}
二、从 min 到 max 的随机整数
创建一个函数 randominteger(min, max),该函数会生成一个范围在 min 到 max 中的随机整数,包括 min 和 max。
在 min…max 范围中的所有数字的出现概率必须相同。
简单但错误的ag真人游戏的解决方案
最简单但错误的ag真人游戏的解决方案是生成一个范围在 min 到 max 的值,并取对其进行四舍五入后的值:
function randominteger(min, max) {
let rand = min math.random() * (max - min);
return math.round(rand);
}
这个函数是能起作用的,但不正确。获得边缘值 min 和 max 的概率比其他值低两倍。
如果你将上面这个例子运行多次,你会很容易看到 2 出现的频率最高。
发生这种情况是因为 math.round()
从范围 1…3 中获得随机数,并按如下所示进行四舍五入:
values from 1 ... to 1.4999999999 become 1
values from 1.5 ... to 2.4999999999 become 2
values from 2.5 ... to 2.9999999999 become 3
现在我们可以清楚地看到 1 的值比 2 少两倍。和 3 一样。
正确的ag真人游戏的解决方案
这个题目有很多正确的ag真人游戏的解决方案。其中之一是调整取值范围的边界。为了确保相同的取值范围,我们可以生成从 0.5 到 3.5 的值,从而将所需的概率添加到取值范围的边界:
function randominteger(min, max) {
// 现在范围是从 (min-0.5) 到 (max 0.5)
let rand = min - 0.5 math.random() * (max - min 1);
return math.round(rand);
}
另一种方法是使用 math.floor
来取范围从 min 到 max 1 的随机数:
function randominteger(min, max) {
// here rand is from min to (max 1)
let rand = min math.random() * (max 1 - min);
return math.floor(rand);
}
现在所有间隔都以这种方式映射:
values from 1 ... to 1.9999999999 become 1
values from 2 ... to 2.9999999999 become 2
values from 3 ... to 3.9999999999 become 3
所有间隔的长度相同,从而使最终能够均匀分配。