• 请不要在回答技术问题时复制粘贴 AI 生成的内容
ukipoi
V2EX  ›  程序员

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

  •  
  •   ukipoi · Nov 13, 2020 · 9180 views
    This topic created in 2042 days ago, the information mentioned may be changed or developed.

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

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

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

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

    Supplement 1  ·  Nov 13, 2020
    我觉得我的标题可能有误导。
    我的问题正确的描述应该是如下:
    “把一个数扩大或者缩小 N 倍,其中 1<N<=2 。扩大和缩小的概率应该相同”

    在数学上,把 X*N 其中 N 在 (1,2] 时符合扩大的描述,N 在 [0.5,1) 时符合缩小的描述
    103 replies    2020-11-16 17:04:54 +08:00
    1  2  
    chenxz
        101
    chenxz  
       Nov 16, 2020
    Math.random() * 1.5 + 0.5?
    exiledkingcc
        102
    exiledkingcc  
       Nov 16, 2020
    @ukipoi
    显然不是的。建议先学习一下概率论。
    jifengg
        103
    jifengg  
       Nov 16, 2020
    取一个大于 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  
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1087 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 18:24 · PVG 02:24 · LAX 11:24 · JFK 14:24
    ♥ Do have faith in what you're doing.