为了账号安全,请及时绑定邮箱和手机立即绑定

在JavaScript中生成特定范围内的随机整数?

在JavaScript中生成特定范围内的随机整数?

在JavaScript中生成特定范围内的随机整数?
查看完整描述

4 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

Mozilla Developer Network页面上有一些示例:


/**

 * Returns a random number between min (inclusive) and max (exclusive)

 */

function getRandomArbitrary(min, max) {

    return Math.random() * (max - min) + min;

}


/**

 * Returns a random integer between min (inclusive) and max (inclusive).

 * The value is no lower than min (or the next integer greater than min

 * if min isn't an integer) and no greater than max (or the next integer

 * lower than max if max isn't an integer).

 * Using Math.round() will give you a non-uniform distribution!

 */

function getRandomInt(min, max) {

    min = Math.ceil(min);

    max = Math.floor(max);

    return Math.floor(Math.random() * (max - min + 1)) + min;

}

这是它背后的逻辑。这是一个简单的三条规则:


Math.random()返回Number0(包括)和1(不包括)之间的值。所以我们有这样的间隔:


[0 .................................... 1)

现在,我们想要一个介于min(包含)和max(独家)之间的数字:


[0 .................................... 1)

[min .................................. max)

我们可以使用它Math.random来获取[min,max]区间内的通讯记录。但是,首先我们应该通过min从第二个区间减去一点来解决问题:


[0 .................................... 1)

[min - min ............................ max - min)

这给出了:


[0 .................................... 1)

[0 .................................... max - min)

我们现在可以申请Math.random然后计算通讯员。我们选择一个随机数:


                Math.random()

                    |

[0 .................................... 1)

[0 .................................... max - min)

                    |

                    x (what we need)

所以,为了找到x,我们会做:


x = Math.random() * (max - min);

不要忘记添加min回来,以便我们在[min,max]间隔中得到一个数字:


x = Math.random() * (max - min) + min;

这是MDN的第一个功能。第二个,返回一个介于min和之间的整数max。


现在获取整数,你可以使用round,ceil或floor。


您可以使用Math.round(Math.random() * (max - min)) + min,但这会产生非均匀分布。这两种,min而max只有大约一半滚动的机会:


min...min+0.5...min+1...min+1.5   ...    max-0.5....max

└───┬───┘└────────┬───────┘└───── ... ─────┘└───┬──┘   ← Math.round()

   min          min+1                          max

与max从区间中排除,它有一个甚至更少的机会,而不是滚动min。


随着Math.floor(Math.random() * (max - min +1)) + min你有一个完美均匀的分布。


min.... min+1... min+2 ... max-1... max.... max+1 (is excluded from interval)

|        |        |         |        |        |

└───┬───┘└───┬───┘└─── ... ┘└───┬───┘└───┬───┘   ← Math.floor()

   min     min+1               max-1    max

你不能使用ceil()和-1在那个等式中,因为max现在滚动的机会略少,但你也可以滚动(不需要的)min-1结果。


查看完整回答
反对 回复 2019-05-24
?
ITMISS

TA贡献1871条经验 获得超8个赞

var randomnumber = Math.floor(Math.random() * (maximum - minimum + 1)) + minimum;


查看完整回答
反对 回复 2019-05-24
?
莫回无

TA贡献1865条经验 获得超7个赞


的Math.random()

Mozilla Developer Network文档中:

// Returns a random integer between min (include) and max (include)


Math.floor(Math.random() * (max - min + 1)) + min;

有用的例子:


// 0 - 10

Math.floor(Math.random() * 11);


// 1 - 10

Math.floor(Math.random() * 10) + 1;


// 5 - 20

Math.floor(Math.random() * 16) + 5;


// -10 - (-2)

Math.floor(Math.random() * 9) - 10;


查看完整回答
反对 回复 2019-05-24
  • 4 回答
  • 0 关注
  • 992 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信