数学上完美的方法来获得均匀采样的“;链“;项
Mathematically perfect way to get an evenly sampled "chain" of items
假设我想递归地创建一个数字列表,方法是从0到9随机选取一个数字开始,然后(可选)从x+1到9随机抽取另一个数字,其中x是最后一个选取的数字,并可选地重复此过程。这样你就可以得到1,3,6
、3,4,8,9
、2,7
等列表。这是我真正想做的事情的简化。
出于我的目的,我不想只是从列表中挑选一堆随机数字,删除重复的数字,然后对它们进行排序。这需要递归地完成。问题是,以我所描述的方式简单地做这件事并不会给所有数字一个平等的机会。它倾向于选择较大的数字而不是较小的数字。我尝试了一些方法来抵消这一点,但它太倾向于小数字了。
这是使用Lo Dash:中的随机整数函数的javascript
function randomlist(index) {
if (index > 8) return;
var range = _.random(9 - index);
var randex = [_.random(index, index + range)];
if (_.random(10) < 6) randex = randex.concat(randomlist(randex[0] + 1));
return randex
}
tally = [0,0,0,0,0,0,0,0,0,0]
for (i=0;i<1000;i++) {
var list = randomlist(0);
list.forEach(function(x){tally[x]+=1});
}
这里,不是只选取x和9之间的随机数,然后先选取一个较小的随机范围,然后再选取其中的随机数。我认为它可能会起作用,但当我运行上面的代码时,tally
最终看起来像[278, 262, 224, 189, 217, 180, 185, 179, 156, 61]
,显然倾向于较小的数字。如果我调整递归的机会,那么平衡就会发生一些变化。我希望有一些公式可以允许可调整的递归机会,并能够生成对所有数字进行均匀采样的列表。
根据您的描述,只有有限数量的"列表"符合该描述。那么,假设您创建了一个包含所有这些元素的数组,然后简单地从数组中随机选择一些元素?此处:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>test-page</title>
<script type="text/javascript">
//<!--
var lists, und, tmp, dv, pkd, i, q,r,s,t,u,v,w,x,y,z;
function begin()
{ lists=[];
for(i=0,q=0; q<10; q++)
for(r=q+1;r<10;r++)
{ lists[i++]=[q,r];
for(s=r+1;s<10;s++)
{ lists[i++]=[q,r,s];
for(t=s+1;t<10;t++)
{ lists[i++]=[q,r,s,t];
for(u=t+1;u<10;u++)
{ lists[i++]=[q,r,s,t,u];
for(v=u+1;v<10;v++)
{ lists[i++]=[q,r,s,t,u,v];
for(w=v+1;w<10;w++)
{ lists[i++]=[q,r,s,t,u,v,w];
for(x=w+1;x<10;x++)
{ lists[i++]=[q,r,s,t,u,v,w,x];
for(y=x+1;y<10;y++)
{ lists[i++]=[q,r,s,t,u,v,w,x,y];
for(z=y+1;z<10;z++)
lists[i++]=[q,r,s,t,u,v,w,x,y,z];
} } } } } } } }
for(j=0; j<i; j++)
{ tmp=document.createElement("span");
tmp.innerHTML=lists[j]+"<br />";
document.body.appendChild(tmp);
}
tmp=document.createElement("span");
tmp.innerHTML="<br />Total: " + i + " lists. <br />"; //1013
document.body.appendChild(tmp);
pkd=[];
i=0;
dv=document.getElementById("pks");
return;
}
function Pick()
{ if(lists==und)
return;
q=Math.floor(Math.random()*1013);
for(r=0; r<i; r++)
if(pkd[r]==q) //check this array for previously-picked list
break;
if(r==i) //not previously picked?
{ pkd[i++]=q; //add to array
tmp=document.createElement("span");
tmp.innerHTML=lists[q]+"<br />";
dv.appendChild(tmp); //display this list
}
else
Pick(); //try again to pick an unpicked list
//DON'T click the button more than 1013 times!
return;
}
// -->
</script>
</head>
<body>
<input type="button" value="create lists" onclick="begin();" />
<input type="button" value="random pick" onclick="Pick();" /><br />
<br />
<div id="pks">
</div>
<br />
</body>
</html>
相关文章:
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 数组在递归方法中设置为null
- 打破承诺链的好方法是什么
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- 使用“;这个“;JavaScript原型方法中的关键字
- 序列化数据属性中对象的最可靠方法
- 使用Objective-C的JavaScript注入方法
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 有没有一种方法可以防止img get请求使用css或js发生
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- toBoolean方法类似于toString
- 如何在单击复选框后调用控制器方法
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 递归使用 eval() 是检查程序执行的好方法吗?
- 如何在webView,Android中从@JavascriptInterface方法调用Javascript
- toLocaleDateString和toLocaleString方法不尊重机器时区
- 有条件更新d3.js力图中节点的最佳方法
- TypeError:在不兼容的接收器nodejs上调用了方法Uint8Array.length
- 数学上完美的方法来获得均匀采样的“;链“;项