请问下,比较简单的实现 0.5 到 2 之间的随机数的方法

2020-11-13 14:54:37 +08:00
 ukipoi

要求就是 扩大一倍或者缩小一倍,两边的概率相同。

这个可以用 Math.radom(),仅以数学的方式,一行就完成吗?

我好像只能先随机出是扩大还是缩小,然后在分别写扩大 /缩小的倍率。

大大们可以给个其他的思路么?

7943 次点击
所在节点    程序员
103 条回复
chenxz
2020-11-16 13:24:35 +08:00
Math.random() * 1.5 + 0.5?
exiledkingcc
2020-11-16 13:54:55 +08:00
@ukipoi
显然不是的。建议先学习一下概率论。
jifengg
2020-11-16 17:04:54 +08:00
取一个大于 1 的整数 N,楼主要的就是产生一个数,50%落在 1/N ~ 1 之间,50%落在 1~N 之间。且他们在各自的区间内是均匀分布的。
比较常见的解法应该是随机两次。第一次看落在那个区间,第二次在这个区间取随机值。
不过可以取巧,只随机一次,然后看这个随机数的小数点后 X 位是偶数还是奇数。X 应该尽可能大一些(比如 X=6 )。
js 代码如:

function randomN(n){
let r = Math.random();
if(parseInt(r*1000000)%2==0){
r=1/n+(1-1/n)*r;
}else{
r=1+(n-1)*r;
}
return r;
}

if 里一开始我写的是 if(r<0.5),这会导致出来的数都只在各自区间的一半里。判断小数点后 X 位的意图就是让 if 和 else 里的 r 都尽可能是 0~1 之间均匀分布的数。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/724860

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX