要求就是 扩大一倍或者缩小一倍,两边的概率相同。
这个可以用 Math.radom(),仅以数学的方式,一行就完成吗?
我好像只能先随机出是扩大还是缩小,然后在分别写扩大 /缩小的倍率。
大大们可以给个其他的思路么?
101
chenxz 2020-11-16 13:24:35 +08:00
Math.random() * 1.5 + 0.5?
|
102
exiledkingcc 2020-11-16 13:54:55 +08:00
@ukipoi
显然不是的。建议先学习一下概率论。 |
103
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 之间均匀分布的数。 |