Javascript 如何生成一组具有两个和的随机数

Javascript 如何生成一组具有两个和的随机数,javascript,math,random,nlp,Javascript,Math,Random,Nlp,我正在尝试使用javascript实现PCFG的内外算法。但是我有一个问题,生成一组随机数据 假设我需要10个随机数,我需要: 前5个数之和为1,后5个数之和也为1 第三、第四、第五、第八、第九和第十的和是1 我不知道该怎么做 目前,我只能实现两点中的一点。 谢谢大家。查看此页() 将给你一个介于0和1之间的数字 假设您对数值没有限制,并且只能实现两点中的一点,那么一个想法是生成0到0.25之间的4个数字(n1到n4)。 只有很少的变化才能得到4乘以0.25=1的结果。 您的第五个号码将仅为1-

我正在尝试使用javascript实现PCFG的内外算法。但是我有一个问题,生成一组随机数据

假设我需要10个随机数,我需要:

  • 前5个数之和为1,后5个数之和也为1
  • 第三、第四、第五、第八、第九和第十的和是1 我不知道该怎么做

    目前,我只能实现两点中的一点。 谢谢大家。

    查看此页()

    将给你一个介于0和1之间的数字

    假设您对数值没有限制,并且只能实现两点中的一点,那么一个想法是生成0到0.25之间的4个数字(n1到n4)。 只有很少的变化才能得到4乘以0.25=1的结果。 您的第五个号码将仅为1-(n1+n2+n3+n4)

    现在如何得到一个介于0和0.25之间的随机数?可能除以4数学。随机()?(小心除以0!)

    同样的想法也适用于第二道题,6个数字除以6(得到0到1/6之间的每个数字,最后提醒得到1)

    编辑:

    检查并改进它

    <html>
        <head>
            <title>Stackoverflow question 31336708</title>
        </head>
    
            <body>
                <script type="text/javascript">
    
                    // Solve rule #2
                    var n3=Math.random()/6;
                    var n4=Math.random()/6;
                    var n5=Math.random()/6;
                    var n8=Math.random()/6;
                    var n9=Math.random()/6;
                    var n10=1-(n3+n4+n5+n8+n9);     // filling the cup for rule #1
    
                    // limit case for rule #1       : n3=n4=n5 = 1/6 and n8=n9 = 0.   n10 = 0.5     ==> spread 0.5 on n6 and n7 ==> random/4
                    // other limit case for rule #1 : n3=n4=n5 = 0   and n8=n9 = 1/6. n10 = 4/6=2/3 ==> spread 1/3 on n6 and n7 ==> random/6
                    // ==> cut the apple in two ==> use random/5 for n2
                    var n2=Math.random()/5;
                    var n1=1-(n2+n3+n4+n5);             // filling the cup for rule #2
    
                    var R1=n1+n2+n3+n4+n5;
                    var R2=n3+n4+n5+n8+n9+n10;
    
                    //checking :
                    alert("Checking rule #1 = <"+R1+"> with\n n1="+n1+"\n n2="+n2+"\n n3="+n3+"\n n4="+n4+"\n n5="+n5);
                    alert("Checking rule #2 = <"+R1+"> with\n n3="+n3+"\n n4="+n4+"\n n5="+n5+"\n n8="+n8+"\n n9="+n9+"\n n10="+n10);
                </script>
        </body>
    </html>
    
    
    堆栈溢出问题31336708
    //求解规则#2
    var n3=Math.random()/6;
    var n4=Math.random()/6;
    var n5=Math.random()/6;
    var n8=Math.random()/6;
    var n9=Math.random()/6;
    变量n10=1-(n3+n4+n5+n8+n9);//为规则1加满杯子
    //规则#1的极限情况:n3=n4=n5=1/6和n8=n9=0。n10=0.5==>在n6和n7上分布0.5==>随机/4
    //规则#1的其他极限情况:n3=n4=n5=0和n8=n9=1/6。n10=4/6=2/3==>在n6和n7上排列1/3==>随机/6
    //==>将苹果切成两半==>使用random/5表示n2
    var n2=Math.random()/5;
    变量n1=1-(n2+n3+n4+n5);//为规则2加满杯子
    var R1=n1+n2+n3+n4+n5;
    变量R2=n3+n4+n5+n8+n9+n10;
    //检查:
    警报(“检查规则#1=带有\n n1=“+n1+”\n n2=“+n2+”\n n3=“+n3+”\n n4=“+n4+”\n n5=“+n5”);
    警报(“检查规则2=与\n n3=“+n3+”\n n4=“+n4+”\n n5=“+n5+”\n n8=“+n8+”\n n9=“+n9+”\n n10=“+n10”);
    
    我会尝试分两步来做

  • 首先,第2项,生成3、4、5、8、9、10个随机数,求和为1。为此,您可以使用Dirichlet分布(或退化gammavariate)。如果你不知道怎么做,就问吧

  • 显然,现在回到#1。首先,生成两个随机数,使其总和为1-(3+4+5)

    x1=范围[0…1-(3+4+5)]内的样本
    
    
    x2=1-(3+4+5)-x1

  • 第二,6,7,8,9,10的方法相同

    y1 = sample in the range [0...1-(8+9+10)]
    y2 = 1-(8+9+10) - y1
    
    y1 = sample in the range [0...1-(8+9+10)]
    y2 = 1-(8+9+10) - y1