怎么通过Math.random 取得 [0, 1]中任意数字?

// [0, 1)
Math.random()
// (0, 1]
(Math.random() - 1) * -1
// (0, 1)
(Math.random() * -1 + Math.random() + 1) / 2
// [0, 1]
how to get the expression ?

阅读 7.1k
10 个回答

可以换个思路来,根据你需要保留的小数位数来做。
例如,需要保留两位小数,也就是0.00-1.00,去掉小数点也就是0-100,那你可以生成0-100的数,然后再除以100就好了。

你那个(0, 1)的写法,概率不均的
并不是所有能在0到1之间的数都能被Math.random生成,建议学习一下计算机如何表示浮点数
我不清楚你是真的有这个需求,还是拍脑袋冒出这个想法来提问的?

function r() {
  var num = Math.random() * 1.1
  if (num > 1) {
    return r()
  }
  return num
}

console.log(r())

如果不要求绝对的平均,那么下面的算法应该可以考虑:

let r = Math.random();
if (r === 0) return Math.random() < 0.5 ? 0 : 1;
return r;

parseInt(Math.random()*2) ?

Math.random()返回的是伪随机数。
假设它返回的是随机数。

在没有小数位长度限制时,[0,1)与(0,1),与[0,1]三个区间是相同的意思。
因为如果0与1之间有无限个数,那么结果为0或1的概率都为0,别看 Math.random()返回的是[0,1)之间数,但没有长度限制的时候下,返回0的概率是0。

当限制了小数位长度时,你这个问题也就不存在了。

答案是不能。这个问题其实就相当于找一个连续递增或递减函数,当x无穷趋近于1时,y等于1,显然不能。
如果限定了小数位数就可以了。
如果只希望得到一个闭合区间的话,通过sin函数,很容易得到[0,1],只是不均匀

新手上路,请多包涵

我和楼主有同样的疑问,前段时间封装公共方法的时候,想弄这么一个函数来着,第三个我是这么实现的(Math.random() + (1 - Math.random())) / 2。最后一个闭区间,实现不了。没办法

从 [0, 1) 到 [0, 1] 的映射,在数学上可行的,但不是连续的。其中一种方案是:

f(x) = 2 *x (如果 x = 1/2^n , n = 1, 2, .... ) ,否则 ,f(x) = x 。

即, 1/2 --> 1, 1/4 --> 1/2, 1/8 --> 1/4, ...... ,其余不动。在实数区间上,这是一个一一映射

这样需要映射的数的数量是可数的,对概率分布影响应该没什么影响。

浮点数的话,事情就复杂了 ... Math.random() 也只敢要求一个 approximately uniform distribution 。

上面的实现在其实是可以搞一下的。浮点的数的分布本身就是不均匀的。[0.5,1) 之间的浮点数,跟[0.25,0,5) 之间的,以及[0.125, 0.25) 之间的都是一样多的。也就是说,浮点数越小越密集。以上的映射做下来,会损失一个很小的浮点数,大概影响不大。

由于浮点数本身分布不均匀,那么如果 Math.random() 真的是在 [0, 1) 之间的近似均匀分布的话,某一个特定的很小的数字的生成的概率会很低。

不过,也正是因为浮点数本身分布不均匀,Math.random() 本身生成 0.5, 0.25, 0.125 ... 的概率可能都不太一样。但是,既然 Math.random() 本身是一个近似均匀分布,映射过后作为一个近似均匀分布应该是也是够用的。

当然,实际业务的话,要看业务想干啥,我觉得通常都不会需要搞这么麻烦 ....

======================
另外说一句,在 [0,1] 上的连续的均匀分布,生成任何一个特定的数的概率都是 0 。所以如果要模拟这样一个分布,最终有没有 1 输出应该是无所谓的。

如果是一个离散均匀分布,那么可能产出的输出的个数是有限的,比如 K 个,那么给他们编号 0 .... K-1 ,[i/K, (i+1)/K) --> i 就可以,也不需要 1 。(这时候,保证不会输出 1 处理起来反而简单)

你这个思路是不可能的。

(谁踩我的答案了,你行你上啊,你倒是给个理由先去你难道能按照楼主的思路做出来是咋滴)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题