V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ukipoi
V2EX  ›  程序员

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

  •  
  •   ukipoi · 2020-11-13 14:54:37 +08:00 · 6700 次点击
    这是一个创建于 1267 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    第 1 条附言  ·  2020-11-13 17:12:37 +08:00
    我觉得我的标题可能有误导。
    我的问题正确的描述应该是如下:
    “把一个数扩大或者缩小 N 倍,其中 1<N<=2 。扩大和缩小的概率应该相同”

    在数学上,把 X*N 其中 N 在 (1,2] 时符合扩大的描述,N 在 [0.5,1) 时符合缩小的描述
    103 条回复    2020-11-16 17:04:54 +08:00
    1  2  
    chenxz
        101
    chenxz  
       2020-11-16 13:24:35 +08:00
    Math.random() * 1.5 + 0.5?
    exiledkingcc
        102
    exiledkingcc  
       2020-11-16 13:54:55 +08:00
    @ukipoi
    显然不是的。建议先学习一下概率论。
    jifengg
        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 之间均匀分布的数。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   933 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:16 · PVG 07:16 · LAX 16:16 · JFK 19:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.