2015-07-10 8 views
0

Я пытаюсь использовать javascript для реализации внутреннего алгоритма PCFG. Но у меня есть эмблема, создающая набор случайных данных.Как сгенерировать набор случайных чисел с двумя суммами

Предположим, что мне нужно 10 случайное число, мне нужно:

  1. сумма первых 5 числа равно 1 и суммировать последний номер 5 и 1;
  2. сумма 3-го, 4-го, 5-го, 8-го, 9-го 10-го числа равна 1;

Я понятия не имею, как я могу это сделать.

В настоящее время я могу реализовать только одну из двух точек. Спасибо всем.

ответ

0

Глядя на этой странице (http://www.w3schools.com/jsref/jsref_random.asp)

Math.random(); 

даст YO число между 0 и 1.

Взятые, что у вас нет ограничений на числовые значения, и что вы могли бы реализовать только один из две точки, одна идея могла бы состоять в том, чтобы сгенерировать 4 числа (от n1 до n4) между 0 и 0,25. У вас будет очень мало изменений, чтобы получить 4 раза 0,25 = 1. Ваше пятое число будет равно 1 - (n1 + n2 + n3 + n4).

Теперь, как получить случайное число от 0 до 0,25? Может быть, делятся на 4 Math.random()? (осторожно деление на 0!)

Та же идея может быть применена к вашей второй проблеме с 6 номерами, делением на 6 (чтобы получить каждое число между 0 и 1/6 и последним напоминанием, чтобы получить 1).

EDIT:

Проверить это и улучшить его!

<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> 
+0

спасибо это делать у меня работает –

0

Я хотел бы попробовать сделать это в два этапа

  1. Во-первых, элемент # 2, генерировать 3, 4, 5, 8, 9, 10 случайных чисел суммируется 1. Для этого вы может использовать распределение Дирихле (или вырожденный гаммавариант). Если вы не знаете, как это сделать, просто спросите.

  2. Очевидно, что теперь вернемся к # 1. Во-первых, вы генерируете два случайных числа, которые суммируются до 1 - (3 + 4 + 5).

    x1 = sample in the range [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 
+0

спасибо это делать работы для меня –

Смежные вопросы