我正在尝试使用javascript来实现PCFG的内外算法。但我有问题产生一组随机数据。
假设我需要10个随机数,我需要:
我不知道我怎么能这样做。
目前,我只能实现两点之一。 谢谢大家。
答案 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)
我会尝试分两步完成
首先,项目#2生成3,4,5,8,9,10个随机数总和为1.为此,您可以使用Dirichlet分布(或简并伽马变量)。如果您不知道该怎么做,请问。
显然,现在回到#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