翼度科技»论坛 编程开发 JavaScript 查看内容

JS语言里常见的随机函数示例,实验结果分布规律分析

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
  在JavaScript语言里有个 Math.random() 随机函数,用于生成指定范围内的随机数。
Math.random()函数

  根据官方的定义: Math.random() 函数返回一个浮点数, 伪随机数在范围[0,1),也就是说,从0(包括0)往上,但是不包括1(排除1),然后您可以缩放到所需的范围。实现将初始种子选择到随机数生成算法;它不能被用户选择或重置。
也就是说 random() 方法可返回介于 0 ~ 1 之间的一个随机数。比如:0.9322870363051519、0.08182448197313485、0.6718927278167157,每次调用它会返回一个含16位小数的随机浮点数。
  我们日常代码过程中实际上是需要生成整数,或是指定区间的随机数,这就需要对它封装改造一下了。常见的封装改造有以下几种。
随机整数:floor + random

示例:生成随机整数,传入参数是最大值(不包括),即返回值是 [0, max)
  1. function getRandomInt(max) {
  2.   return Math.floor(Math.random() * Math.floor(max));
  3. }
  4. console.log(getRandomInt(3));
  5. // expected output: 0, 1 or 2
  6. console.log(getRandomInt(1));
  7. // expected output: 0
复制代码
指定区间的随机数(一)

示例:这个例子返回了一个在指定值之间的随机数 [min, max)。这个值不小于 min(有可能等于),并且小于(不等于)max。
  1. function getRandomArbitrary(min, max) {
  2.   return Math.random() * (max - min) + min;
  3. }
  4. console.log(getRandomArbitrary(1,3));
  5. // expected output: 1.0501238302537486,1.9956248025522734,2.7839421306375227 ……
复制代码
指定区间的随机数(二)

示例:这个例子返回了一个在指定值之间的随机整数 [min, max)。这个值不小于 min (如果 min 不是整数,则不小于 min 的向上取整数),且小于(不等于)max。
  1. function getRandomInt(min, max) {
  2.   min = Math.ceil(min);
  3.   max = Math.floor(max);
  4.   return Math.floor(Math.random() * (max - min)) + min; //不含最大值,含最小值
  5. }
  6. console.log(getRandomInt(1,3));
  7. // expected output: 1 or 2
复制代码
也许很容易想到用 Math.round() 来实现,但是这会导致你的随机数处于一个不均匀的分布,这可能不符合你的需求。
指定区间的随机数(三)

上一个例子提到的函数 getRandomInt() 结果范围包含了最小值,但不含最大值。如果你的随机结果需要同时包含最小值和最大值,怎么办呢?  getRoundRandom() 函数可以实现得到一个两数之间的随机整数,包括两个数在内。
示例:这个例子返回了一个在指定值之间的随机整数 [min, max]。这个值不小于 min (如果 min 不是整数,则不小于 min 的向上取整数),且不大于max(如果 max 不是整数,则不小于 max 的向下取整数)。
  1. function getRoundRandom(min, max){
  2.     return Math.round(Math.random()*(max-min))+min;
  3. }
  4. console.log(myRoundRandom(1,3));
  5. // expected output: 1, 2 or 3
复制代码
  需要注意:Math.round() 函数返回一个数字四舍五入后最接近的整数。它取整的结果分布不均,大概成正泰分布。验证:var num = getRoundRandom(0, 5); 生成5轮,每轮10000个结果分布如下:

指定区间的随机数(四)

得到一个两数之间的随机整数,包括两个数在内。如果想概率分布均匀一点可以使用 Math.trunc()
Math.trunc() 方法会将数字的小数部分去掉,只保留整数部分。Math.trunc() 的执行逻辑很简单,仅仅是删除掉数字的小数部分和小数点,不管参数是正数还是负数。传入该方法的参数会被隐式转换成数字类型。
示例:这个例子返回了一个在指定值之间的随机整数 [min, max]。这个值不小于 min,且不大于max。
  1. function getTruncRandom(min, max){
  2.     return Math.trunc(Math.random()*(max-min+1))+min;
  3. }
  4. console.log(getTruncRandom(1,3));
  5. // expected output: 1, 2 or 3
复制代码
可以简写:const getTruncRandom=(min,max)=>Math.trunc(Math.random()*(max-min+1)+min);
验证:var num = getTruncRandom(0, 5); 生成5轮,每轮10000个结果分布如下:

指定区间的随机数(五)

前面例子提到的函数 getRandomInt() 结果范围包含了最小值,但不含最大值。如果你的随机结果需要同时包含最小值和最大值,怎么办呢?  getRandomIntInclusive() 函数可以实现得到一个两数之间的随机整数,包括两个数在内。
示例:这个例子返回了一个在指定值之间的随机整数 [min, max]。这个值不小于 min (如果 min 不是整数,则不小于 min 的向上取整数),且不大于max(如果 max 不是整数,则不小于 max 的向下取整数)。
  1. function getRandomIntInclusive(min, max) {
  2.   min = Math.ceil(min);
  3.   max = Math.floor(max);
  4.   return Math.floor(Math.random()*(max-min+1))+min; //含最大值,含最小值
  5. }
  6. console.log(getRandomIntInclusive(1,3));
  7. // expected output: 1, 2 or 3
复制代码
验证:var num = getRandomIntInclusive(0, 5); 生成5轮,每轮10000个结果分布如下:

总结

  1,实验三采用round + random方式最终验证随机结果分布不均衡,不予采用;
  2,实验四、实验五最终验证随机结果分布接近均衡,均可以采用;
  3,实验四利用 trunc + random 实现方式简洁,运算次数更少,推荐采用;
附件代码:生成5轮,每轮10000个结果分布

[code][/code]【完】

来源:https://www.cnblogs.com/xiongzaiqiren/p/js-random.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具