如何用两个和生成一组随机数

时间:2015-07-10 09:04:44

标签: javascript math random nlp

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

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

  1. 前5个数字的总和为1,最后5个数字的总和也为1;
  2. 第3,第4,第5,第8,第9个10的总和为1;
  3. 我不知道我怎么能这样做。

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

2 个答案:

答案 0 :(得分:0)

查看此页面(http://www.w3schools.com/jsref/jsref_random.asp

Math.random();

会给你一个0到1之间的数字。

假设您对数值没有约束,并且您只能实现两个点中的一个,一个想法可能是生成0到0.25之间的4个数字(n1到n4)。 你将获得很少的变化来获得4次0.25 = 1。 你的第五个数字只有1 - (n1 + n2 + n3 + n4)。

现在如何获得0到0.25之间的随机数?也许除以4 Math.random()? (小心除以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>

答案 1 :(得分:0)

我会尝试分两步完成

  1. 首先,项目#2生成3,4,5,8,9,10个随机数总和为1.为此,您可以使用Dirichlet分布(或简并伽马变量)。如果您不知道该怎么做,请问。

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

    x1 = sample in the range [0...1-(3+4+5)] x2 = 1-(3+4+5) - x1

  3. 其次,对于6,7,8,9,10

    采用相同的方法
    y1 = sample in the range [0...1-(8+9+10)]
    y2 = 1-(8+9+10) - y1